Difference when returning an array of chars or a pointer to char literal
我了解到,当我初始化一个字符数组时,就像初始化指向字符的指针一样。但是,如果是这种情况,为什么下面的代码会输出奇怪的字符?
1 2 3 4 5
| char* returnMe()
{
char text[] ="Will I live forever?";
return text;
} |
而以下代码:
1 2 3 4 5
| char* returnMe()
{
char* text ="Will I live forever?";
return text;
} |
输出:
Will I live forever?
这两个初始化之间到底有什么区别?它们都像指针,所以如果我这样做:
1
| puts(X); //puts get char* as a parameter in it. |
这两种情况都适用(当我还没有超出范围时)。
- 相关:stackoverflow.com/questions/30533439/…
- 在任何情况下都不会返回数组。您将返回指向数组第一个元素的指针。如果数组不再存在,这一点很重要。
- BTW在C++中可以通过使用EDCOX1×0来避免所有的头。
- 参考这一点。stackoverflow.com/questions/1335786/…
- 您的代码将导致ub:返回一个局部变量:return text"text[]"。
- 叹气C不是C++不是C。不要垃圾邮件标签!而"CPP"是C预处理器,不是C++!
- 很明显你学到了一些错误。如果数组是指针,则称为"指针",而不是"数组"(反之亦然)。
- 奥拉夫通常我完全支持你的C不是C++十字军,但即使如此,也把CPP列为C++的同义词(虽然小写)。
- 由于这里提到的原因,char*应该是const char*。
- @托比303:在你的控制台上试试cpp。(这与C不是C++策略有关,A都使用CPP。)无论如何,我删除了CPP,因为语言无论如何都不应该在标题中。这就是标签的作用。
- "我了解到,当我初始化一个字符数组时,就像初始化一个指向字符的指针一样"——这是错误的,无论您从中"学到"什么源,您现在都应该将其视为一个坏源。
- 2010以来EDCOX1 5的有效性不高,在C++ 11中无效,原因很好。应该是const char* text ="Will I live forever?";。
包含此项的函数:
1
| char text[] ="Will I live forever?"; |
返回一个指向名为text的局部变量的指针,该变量包含字符串"我会永远活着吗?".与所有局部变量一样,该变量在函数返回后会蒸发,因此如果试图访问它,则会在未定义的行为域中关闭。
包含此项的函数:
1
| char* text ="Will I live forever?"; |
返回一个指向内存中某个神奇位置(但不是局部变量)的指针,该位置包含字符串,该字符串将在程序执行时一直存在,因此使用该指针不是未定义的行为。
- 这么长的文字只说‘内存分配:1.在堆栈上。2。在二进制文件的只读部分。"这解释了一切。
- @TOBI303返回局部变量的"copy"。(因为ABI将返回的代码定义为%R1 IIRC,所以任何适合寄存器的代码都可以这样返回)
- @托比303,肤浅的副本,是的。指针适合寄存器。这就是你从return text;案件中得到的一切。
- 这与登记簿中的内容无关。
- 我从来没有完全理解数组与指针的关系,我从这个答案中真正学到了一些东西:上票(去掉了一些嘈杂的评论)
- @尼尔巴特沃思,怎么了?在低层次上,这正是ABI定义的。下一个层次是涉及的其他一些标准和协议(如C标准)。在这种情况下,ub非常明显。
- @ 0没有C++ABI。C++中没有任何要求返回值在寄存器中传递,或者如果它们以这种方式传递,则建议不同的语义。相反,C++(和C)程序必须以相同的方式执行,但是函数和返回值被实现。
- @尼尔巴特沃思,再一次,(这里的大多数人出于某种未知的原因害怕神奇的ABI缩写)C标准比ABI更高。ABI的定义不涉及任何编程语言,直接CPU指令除外。ABI是为CPU而不是为PL而编写的。
- @0抱歉,您可能不知道自己在说什么,也可能无法用英语表达自己,或者两者兼而有之。
- @尼尔巴特沃斯,好吧,英语不是我的母语,确实,但你选择了谈论话题的方式。只有谷歌的abi x86_64,或abi的ARM。
- 在C++中编写代码的一个主要原因是不关心CPU的细节,比如寄存器。
- @Tobi303,正确。我反对这与登记册上的内容无关。当然有。
- 与这个问题无关,如果他返回带有指向局部变量指针的大型结构,当然不能放入寄存器,当然仍然崩溃,那么他也会遇到同样的问题。
- @0并且某些系统在二进制文件中既没有堆栈,也没有只读部分。这个问题可以,而且IMO应该在不参考具体系统细节的情况下回答。
- @M.M很好,谢谢!