#includeint* f(void); void g(void); int main(int argc,char const *argv[]) { int *p = f();//得到f函数返回的指针 printf("*p=%dn",*p); g(); printf("*P=%dn",*p); return 0; } int* f(void) { int i=12; return &i; } void g(void) { int k=24; printf("k=%dn",k); }
这个值进入栈,然后出栈了,下一个值占用了这个栈里面的位置,*p的地方原来叫i是12,当出了函数,这个地方虽然还是12的形式,但是已经不叫i了,下一个函数重新得到了这块空间,并把这个地方叫做k,然后把这个地方的12删掉,写成24.
所以返回本地变量的地址是危险的,返回全局变量或者静态变量的地址是安全的,返回在函数内的malloc的内存是安全的,但容易造成问题,最好的做法是返回传入的指针。
但还是要尽量不要使用全局变量在函数间传递参数和结果,尽量避免使用全局变量,使用全局变量和静态本地变量的函数是线程不安全的。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)