-2

我有一个必须接收字符串的主函数。

main()
{
    char *c = fun();
}

char* fun()
{
    char a[] = "hello";
    return a;
}

问题是,如果我返回长度为 3 或更少的字符串,那么一切都很好。如果我返回长度 > 3 的字符串,那么我会收到与字符串一起的垃圾值。这是为什么 ?

4

4 回答 4

3

您返回一个指向局部变量的指针。该变量是堆栈分配的,并在函数退出时被销毁。使用这样的指针是未定义的行为。

于 2013-06-17T20:25:26.363 回答
1
char* fun()
{
    char a[] = "hello";
    return a;
}

阵列a具有自动存储期限。在函数结束时,数组对象a被销毁。这意味着指针在函数退出时变得无效,并且对它的任何使用都是未定义的行为。

于 2013-06-17T20:25:26.240 回答
1

您正在返回一个自动变量,这是一个很大的禁忌。它完全起作用是实施的意外。

于 2013-06-17T20:25:29.177 回答
0

该变量a是 本地的fun(),因此在您返回时超出范围(并且不存在)。适用于任何情况的事实是纯粹的运气。您可以进行a静态分配或动态分配,或以其他方式修复它。

于 2013-06-17T20:27:06.423 回答