想问一下为什么两个prinf输出的结果不一样,后面那个为0,并且除了第一个printf之后的所有都为0,为啥两个printf输出结果不都为23?求指教
int *g(void);
int main(){
int *p=g();
printf("%d\n",*p);
printf("%d\n",*p);
return 0;
}
int *g(void){
int i=23;
return &i;
}
想问一下为什么两个prinf输出的结果不一样,后面那个为0,并且除了第一个printf之后的所有都为0,为啥两个printf输出结果不都为23?求指教
int *g(void);
int main(){
int *p=g();
printf("%d\n",*p);
printf("%d\n",*p);
return 0;
}
int *g(void){
int i=23;
return &i;
}
g()函数返回的是一个int类型的指针,这个指针指向了g()函数中的临时变量 i ,变量 i的作用域仅在g()函数内部起作用,在g()函数外面,变量 i所属的内存空间被回收变为空闲内存,也就可能会被分配给其它变量(可能是其它程序的变量),所以,在main()函数中就有可能出现两个不一样的结果。
如果想要保持一致,在g()函数中需要手动申请内存,手动申请的内存,只有手动释放或者在程序结束后才会被系统回收,这时候在main函数中的值就是一致的。代码如下:
int* g(void) {
int *i = (int*)malloc(sizeof(int));
*i = 23;
return i;
}
运行结果: