以下代码是否有问题,如果有,那么编译运行的结果是什么,并说明问题的原因是什么,如何修改
#include <stdio.h>
char *get_str(void);int main(void)
{char *p = get_str();printf("p = %pn",p);printf("%sn",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 = %pn",p);printf("%sn",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 = %pn",p);printf("%sn",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指针也会被释放内存。
本文发布于:2024-01-27 23:44:38,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/17063702773364.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |