返回字符数组和返回字符字面值指针的差异

3
我了解到当我初始化一个字符数组时,就像初始化一个指向字符的指针。 但是,如果这是情况,为什么下面的代码输出奇怪的字符?
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.

它适用于两种情况(当我还没有超出作用域的时候)。

2
顺便说一下,在C ++中,您可以通过使用std :: string来避免所有这些麻烦。 - 463035818_is_not_a_number
2
叹气一声,C不是C++,C++也不是C。别滥用标签!“CPP”是C的预处理器,不是C++! - too honest for this site
1
@Olaf,通常我完全支持你的“C不是C ++”的运动,但是SO甚至将cpp列为C++的同义词(尽管小写)。 - 463035818_is_not_a_number
1
char* 应该改为 const char*,原因在这里提到:https://dev59.com/aF_Va4cB1Zd3GeqPPxjy#8795589。 - wally
1
我了解到,当我初始化一个字符数组时,它就像初始化一个字符指针一样。这是错误的,无论你从哪里“学习”这个,现在都应该视为不好的来源。 - M.M
显示剩余7条评论
1个回答

10

包含此内容的函数:

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

返回一个指向名为text的本地变量的指针,该变量包含字符串"Will I live forever?"。与所有本地变量一样,该变量在函数返回后会消失,因此如果尝试访问它,则会进入未定义的行为领域。

包含此内容的函数:

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

返回一个指针,指向内存中的某个神奇位置(但不是局部变量),其中包含字符串,该字符串在程序执行期间保持不变,因此使用该指针不会产生未定义的行为。


这段代码相关的内容可以简单地表述为:“内存分配方式有两种:1. 在栈上分配;2. 在二进制文件的只读区域分配。”这就解释了一切。 - 0andriy
1
这与寄存器可以容纳的内容无关。 - user2100815
2
我从来没有完全理解过数组和指针的区别,但是我从这个答案中学到了很多:)点赞了(并删除了一些嘈杂的评论)。 - 463035818_is_not_a_number
如果他返回具有指向本地变量的指针的巨大结构体,那么与此问题无关,肯定不适合寄存器,肯定仍然会崩溃。 - pm100
1
@0andriy,有些系统既没有堆栈,也没有二进制文件中的只读部分。我认为这个问题可以回答,而且应该回答,而不涉及具体的系统细节。 - M.M
显示剩余9条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接