以下代码是否有问题,如果有,那么编译运行的结果是什么,并说明问题的原因是什么,如何修改
#include <stdio.h>
char *get_str(void);
int main(void)
{
char *p = get_str();
printf("p = %p\n",p);
printf("%s\n",p);
return 0;
}
char *get_str(void)
{
char str[]={"abcd"};
return str;
}
orangepi@orangepizero2:~/list$ gcc test13.c
test13.c: In function ‘get_str’:
test13.c:14:9: warning: function returns address of local variable [-Wreturn-local-addr]
return str;
^~~
orangepi@orangepizero2:~/list$ ./a.out
p = (nil)
Segmentation fault
编译提示警告,函数 char *get_str(void) 返回的是局部变量地址,运行后提示段错误。
char str[]={“abcd”}数组是局部变量
当进入函数时,局部变量存储在栈中,当退出函数时,返回str[]数组的首地址,函数结束之后,系统会回收为局部变量开创的栈空间。返回的地址就会指向NULL,地址就不再存在了。
#include <stdio.h>
char *get_str(void);
int main(void)
{
char *p = get_str();
printf("p = %p\n",p);
printf("%s\n",p);
return 0;
}
char *get_str(void)
{
static char str[]={"abcd"};
return str;
}
运行结果
orangepi@orangepizero2:~/list$ ./a.out
p = 0x558cccd010
abcd
char str[]={“abcd”};变成了 static char str[]={“abcd”}
加了static,str没有放在栈中了,而是放在静态内存中,不会因为函数的结束而被释放,
#include <stdio.h>
char *get_str(void);
int main(void)
{
char *p = get_str();
printf("p = %p\n",p);
printf("%s\n",p);
return 0;
}
char *get_str(void)
{
char *str ={"abcd"};
return str;
}
运行结果
orangepi@orangepizero2:~/list$ ./a.out
p = 0x55792aa870
abcd
char str[]={“abcd”} 变成了 char str ={“abcd”}
把str[]数组变量改为了 str 指针,指针是一个指向地址的变量,{“abcd”}为一个字符串,由于没有赋值变量,没有变量名,它就是一段存储在静态内存的常量,函数退出了,也不影响它的存在,str返回的是这个常量的第一个地址。函数返回后str指针也会被释放内存。