关于指针函数的两个例子:
第一个例子:下面这段代码是否能正确运行?
#include<stdio.h>
char * get_string() {
char *s = "hello";
return s;
}
int main() {
char *p;
p = get_string();
printf("p=%s\n", p);
}
因为s指向的是字符串常量,被存储在静态区(全局区)中,所以可以返回给main,运行结果正常。
p=hello
第二个例子:下面这段代码是否还能正常运行?
#include<stdio.h>
char * get_char_array() {
char ch[10] = {'h', 'e', 'l', 'l', 'o', '\0'};
return ch;
}
int main() {
char *q;
q = get_char_array();
printf("q=%s\n", q);
return 0;
}
运行结果如下:
warning: function returns address of local variable [enabled by default]
q={�������P(f���9���{�����r�����{�U��~�
原因是函数返回的是一个局部变量的地址,主函数无法访问,指针q变成了野指针,所以输出的结果无法预知。既然如此,有哪些解决办法呢?从指针函数返回的指针类型入手。
指针函数中可以返回什么样的指针?
-
字符串常量的地址
上述第一个例子可以正常运行,是因为指针s指向的是字符串常量,被存储静态区(全局区)中,不管是不是在主函数中都可以访问,因此不会报错。
-
static变量的地址
char * get_char_array() { static char ch[10] = {'h', 'e', 'l', 'l', 'o', '\0'}; return ch; }
既然存在静态区(全局区)中的变量可以解决主函数无法访问的问题,那直接将变量定义为static变量也能解决问题,所以,第二个例子中的代码更改如上,运行结果:
q=hello
-
全局变量的地址
在非主函数中定义的局部变量的地址,在主函数中无法访问,那如果直接将变量定义为全局变量,程序中的所有函数均可访问,也能解决问题,上述第二个例子中的代码还可以改成:
char ch[10] = {'h', 'e', 'l', 'l', 'o', '\0'};
char * get_char_array() {
return ch;
}
运行结果如下:
q=hello
把变量定义在所有函数之外,确实能解决主函数无法访问局部变量的问题,但同时也给程序的稳定性和安全性带来了一定挑战,编程过程中要特别注意,以免得到意想不到的答案。
-
主调函数中有效内存地址
这种方法是直接在主函数中定义指向有效内存地址的指针,将其传递给函数,在函数内通过指针访问所指向的对象,并对其进行操作,所以第二个例子又可以更改为:
#include<stdio.h>
char * get_char_array(char *ch) {
return ch;
}
int main() {
char *q;
char ch[10] = {'h', 'e', 'l', 'l', 'o', '\0'};
q = get_char_array(ch);
printf("q=%s\n", q);
return 0;
}
运行结果如下:
q=hello
在这个例子中,将字符数组ch定义在main函数内,并将指向ch的指针传递给函数get_char_array,然后又返回指针,这个例子中,get_char_array没有对ch进行任何操作,只是为了说明这种方法。
-
堆的地址
这种方法下次再记笔记。
标签:ch,函数,get,笔记,char,例子,array,指针 From: https://blog.csdn.net/boy_ding_jian/article/details/139719195