在C语言中从函数返回字符串

3
我对如何从函数返回字符串感到困惑。
char* someFunction()
{
  return "Hello, World"
}

上面的返回语句不应该抛出“函数返回局部变量地址”的错误,那么它与以下函数有何不同:

char* newFunction()
{
  char temp[] = "Hello, World";
  return temp;
}

实际上,这确实会给出上述警告。


1
你需要确保第一个案例中的 const char* 是真正的。 - Flexo
请注意,“throw”一词通常指异常处理机制……鉴于C语言没有任何内在支持,这可能不是您的意思。 - Kaganar
2
有一个现有的问题( https://dev59.com/NXI-5IYBdhLWcg3wu7FU ),它涵盖了两种情况之间的重要区别。 - Flexo
2个回答

5
在第一种情况下,该字符串始终存在于常量只读内存中的固定地址。在第二种情况下,字符串被放置在堆栈上本地化,因此是临时的。

我没有完全理解你说的话。你是在说由于它是一个字符串常量,所以编译器在编译时已经分配了内存,因此不会引起任何问题吗? - Pratt
是的,编译器正在将字符串静态分配到固定的全局地址。我的意思与ouah的被接受答案相同。 - TJD

1

字符串字面值具有静态存储期。您可以返回指向字符串的指针,然后访问该字符串,这是完全有效和定义良好的行为。

char* someFunction()
{
  return "Hello, World"
}

在下面的情况中,您正在返回指向具有自动存储期的字符串的指针。具有自动存储期的对象在定义它的块退出后被销毁。因此,在函数返回后访问它是未定义的行为。
char* newFunction()
{
  char temp[] = "Hello, World";
  return temp;
}

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