我是 C 语言新手
这是我的代码:
char* getString()
{
char s[] = "Will I be printed?";
return s;
}
int main()
{
printf("%s", getString());
getchar();
}
它显示警告:函数返回局部变量的地址
现在当我编码时:
char* getString()
{
char *s = "Will I be printed?";
return s;
}
int main()
{
printf("%s", getString());
getchar();
}
它将打印字符串:“我会被打印吗?”
这是为什么? 指针和字符数组都是本地变量并且它们存储在堆栈中,这是真的吗?
P.S我正在使用http://ide.geeksforgeeks.org/
最佳答案
在这两种情况下,字符串文字本身很可能存储在对象文件的只读数据区域中,该区域被映射到程序的地址空间。
在第一种情况下,字符串的存储将在堆栈上分配,编译器可能会生成一些代码来制作字符串的副本,并将其存储在堆栈上。当函数返回时,该存储被回收,并且尝试通过返回的堆栈指针从函数外部访问它是未定义的行为,并且您会收到编译器警告。
在第二种情况下,字符串文字的地址存储在char *
变量中。它将直接指向字符串文字存储在运行时地址空间中的任何位置。当函数返回指针值时(注意:不是指针本身的地址,它在堆栈上,而是它所保存的值,它是指向字符串存储区域的指针),该地址在范围之外仍然有效。函数,并且程序按预期工作。
关于c - C 函数返回字符指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46694194/