我有一个必须接收字符串的主函数。
main()
{
char *c = fun();
}
char* fun()
{
char a[] = "hello";
return a;
}
问题是,如果我返回长度为 3 或更少的字符串,那么一切都很好。如果我返回长度 > 3 的字符串,那么我会收到与字符串一起的垃圾值。这是为什么 ?
我有一个必须接收字符串的主函数。
main()
{
char *c = fun();
}
char* fun()
{
char a[] = "hello";
return a;
}
问题是,如果我返回长度为 3 或更少的字符串,那么一切都很好。如果我返回长度 > 3 的字符串,那么我会收到与字符串一起的垃圾值。这是为什么 ?
您返回一个指向局部变量的指针。该变量是堆栈分配的,并在函数退出时被销毁。使用这样的指针是未定义的行为。
char* fun()
{
char a[] = "hello";
return a;
}
阵列a
具有自动存储期限。在函数结束时,数组对象a
被销毁。这意味着指针在函数退出时变得无效,并且对它的任何使用都是未定义的行为。
您正在返回一个自动变量,这是一个很大的禁忌。它完全起作用是实施的意外。
该变量a
是 本地的fun()
,因此在您返回时超出范围(并且不存在)。适用于任何情况的事实是纯粹的运气。您可以进行a
静态分配或动态分配,或以其他方式修复它。