Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 返回字符数组或指向字符文字的指针时的差异_C++_Arrays_Pointers - Fatal编程技术网

C++ 返回字符数组或指向字符文字的指针时的差异

C++ 返回字符数组或指向字符文字的指针时的差异,c++,arrays,pointers,C++,Arrays,Pointers,我了解到初始化字符数组就像初始化指向字符的指针一样。 但是,如果是这种情况,为什么下面的代码会输出奇怪的字符 char* returnMe() { char text[] = "Will I live forever?"; return text; } 而以下代码: char* returnMe() { char* text = "Will I live forever?"; return text; } 产出: 我会永远活着吗 这两种初始化之间到底有什么区别

我了解到初始化字符数组就像初始化指向字符的指针一样。 但是,如果是这种情况,为什么下面的代码会输出奇怪的字符

char* returnMe()
{
    char text[] = "Will I live forever?";
    return text;
}
而以下代码:

char* returnMe()
{
    char* text = "Will I live forever?";
    return text;
}
产出:

我会永远活着吗

这两种初始化之间到底有什么区别? 它们都像指针,所以如果我这样做:

puts(X); //puts get char* as a parameter in it.

它适用于这两种情况(当我还没有超出范围时)。

包含以下内容的函数:

 char text[] = "Will I live forever?";
 char* text = "Will I live forever?";
返回一个指向名为
text
的局部变量的指针,该变量包含字符串“我会永远活下去吗?”。与所有局部变量一样,该变量在函数返回后消失,因此如果您试图访问它,您将处于未定义的行为状态


包含以下内容的函数:

 char text[] = "Will I live forever?";
 char* text = "Will I live forever?";

返回一个指向内存中的魔法位置(但不是局部变量)的指针,它是程序执行的持久性,所以使用该指针不是未定义的行为。C++中的

BTW可以通过使用<代码> STD::String < /Cord>避免所有的标题。Sc:C不是C++,不是C。不要垃圾邮件标签!“CPP”是C预处理器,不是C++!奥拉夫通常完全支持C不是C++十字军,但是即使把CPP列为C++的同义词(虽然小写),<代码> char *<代码>应该是<代码> const char */c>,因为我提到了当初始化一组字符时,就像初始化一个字符的指针一样——这是错误的,不管你是什么来源“从中学到”您现在应该认为这是一个不好的源代码。这么长的文本只说“内存已分配:1.在堆栈上。2.在二进制文件的只读部分。”这就解释了一切。@tobi303它返回局部变量的“副本”。(因为ABI将返回的代码定义为%r1 IIRC,所以任何符合寄存器的代码都可以这样返回)这与寄存器中的内容无关。我从来没有完全理解数组和指针的关系,我从这个答案中学到了一些东西:)升级(并删除了一些嘈杂的注释)@0andriy有些系统既没有堆栈,也没有二进制文件中的只读部分。可以回答这个问题,而且我也应该回答这个问题,而不必参考具体的系统详细信息