【问题标题】:Function return character pointer in C [duplicate]C中的函数返回字符指针[重复]
【发布时间】:2018-03-23 11:33:17
【问题描述】:

我是 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();
}

它将打印字符串:“我会被打印吗?”

这是为什么呢? 指针和字符数组都是本地变量并且它们存储在堆栈中是真的吗?

PS 我正在使用http://ide.geeksforgeeks.org/

【问题讨论】:

  • 格式化/缩进:(
  • 在谷歌上搜索你的错误信息。我相信你会找到答案的。
  • 字符串本身是静态存储的,但变量s是函数本地的,所以函数返回时不存在。将s 声明为static。

标签: c


【解决方案1】:

首先,不要标记这个 C++,它不是 C++。

它会引发警告,因为您在函数的第一种形式中创建的数组是一个局部变量,一旦超出范围就会被销毁。您将内存地址返回给本质上被删除的东西。

第二个函数有效,因为您正在创建一个指向未在本地定义的字符串的指针,它只是您可以使用的内存中的一个点。

【讨论】:

  • 这意味着指针变量没有存储在堆中?所以它们存储在数据段中?@Kilbo
  • @chiragchevli 在第二种情况下,变量本身的存储位置并不重要。你返回它的值,这个值是一个字符串常量的地址,它不是函数本地的。
  • 谢谢@WilliamPursell 我明白了!!
【解决方案2】:

在这两种情况下,字符串文字本身很可能存储在目标文件的只读数据区域中,该区域被映射到程序的地址空间中。

在第一种情况下,字符串的存储空间将分配在堆栈上,编译器可能会生成一些代码来制作字符串的副本,并将其存储在堆栈上。当函数返回时,该存储被回收,并且试图从函数外部通过返回到堆栈的指针访问它是未定义的行为,并且您会收到编译器警告。

在第二种情况下,字符串文字的地址存储在char *变量中。它将直接指向字符串文字存储在运行时地址空间中的任何位置。当函数返回指针值时(注意:不是指针本身的地址,在栈上,而是它所持有的值,是指向字符串存储区的指针),地址在作用域外仍然有效功能,程序按预期工作。

【讨论】:

  • 感谢@Jim Lewis ..明白了!!这意味着第二种情况下的字符串文字存储在 运行时地址空间而不是堆栈段中 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-11
  • 2015-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-21
  • 2016-03-25
相关资源
最近更新 更多