c - C 函数返回字符指针

标签 c

我是 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/

相关文章:

c - 在 C 中通过引用传递

c - 目标文件中函数的返回值在 C 中发生变化

c - 通过c中的套接字发送多条消息

c - 使用字符输入执行 while 循环

c - 如何使用 openmp 在 c 中进行具有一些 for 循环的任务并行化?

c - 初始化char数组时,剩余空间是填零还是未初始化?

C:按降序对 vector 元素进行排序

c - 数组声明的问题

在包含函数退出后通过其地址调用嵌套函数?

Python C API 如何将结构数组从 C 传递给 Python