Function return character pointer in C
我不懂C语言
这是我的代码:
1 2 3 4 5 6 7 8 9 10
| char* getString ()
{
char s [] ="Will I be printed?";
return s ;
}
int main ()
{
printf("%s", getString ());
getchar();
} |
它显示警告:函数返回局部变量的地址
现在,当我编写代码时:
1 2 3 4 5 6 7 8 9 10
| char* getString ()
{
char *s ="Will I be printed?";
return s ;
}
int main ()
{
printf("%s", getString ());
getchar();
} |
它将打印字符串:"要打印吗?"
为什么会这样?指针和字符数组都是局部变量,并且存储在堆栈中,这是真的吗?
我正在使用http://ide.geeksforgeks.org/
- (indentation:格式/
- 在Google搜索你的错误消息。我知道你想要得到的答案。
- 它是存储在字符串statically s是局部的,但变量的函数,所以不存在时,函数返回。sstatic的声明。
在这两种情况下,字符串本身很可能存储在对象文件中的只读数据区域中,对象文件映射到程序的地址空间中。
在第一种情况下,字符串的存储将在堆栈上分配,编译器可能会生成一些代码来复制存储在堆栈上的字符串。当函数返回时,该存储将被回收,并试图通过返回到堆栈的指针从函数外部访问它,这是未定义的行为,您将收到编译器警告。
在第二种情况下,字符串文字的地址存储在char *变量中。它将直接指向字符串存储在运行时地址空间中的任何位置。当函数返回指针值时(注意:不是指针本身在堆栈上的地址,而是它所保存的值,它是字符串存储区域的指针),该地址在函数作用域之外仍然有效,并且程序按预期工作。
- 谢谢@Jim Lewis…明白了!!第二种情况下的字符串文本存储在运行时地址空间中,而不是堆栈段中:)
首先,不要标记这个C++,它不是C++。
它抛出警告,因为您在函数的第一个形式中创建的数组是一个局部变量,一旦超出范围就会被销毁。您正在将内存地址返回到一些基本上已被删除的内容。
第二个函数可以工作,因为您创建的指针指向的字符串不是本地定义的,它只是内存中的一个点,您可以使用它。
- 这意味着指针变量不存储在堆中?所以它们存储在数据段中?@ Kilbo
- @在第二种情况下,存储变量本身的Chiragchevli并不重要。返回它的值,该值是一个字符串常量的地址,该常量不是函数的本地变量。
- 谢谢@williampursell我明白了!!