返回局部char*和char[]的不同行为

different behaviour of returning local char* and char[]

本文关键字:char 返回局      更新时间:2023-10-16

我想这是存储/定义的差异,但我仍然找不到对行为的直接解释。我有一个函数,它以两种方式返回本地定义的char*:

//Try 1:
char* printSomething()
{
 char arr[100];
 sprintf(arr, "The data %u", 100);
 return arr;
}
//Try 2:
char* printSomething()
{
 return "The data 100";
}

当我打印第一个函数的结果时,它不显示任何内容(C)或垃圾(C++),而在第二个函数中,它打印正确的数据。我知道在这种情况下我应该把数据存储在堆上,或者定义静态变量,但为什么第一个不起作用,而第二个起作用?还有,我能指望第二种工作方式吗?

第一个只是未定义的行为,因为arr在函数结束时释放,所以只剩下一个悬空指针。

第二种方法之所以有效,是因为"The data 100"是一个具有静态存储持续时间的字符串文字,这意味着它在程序的整个生命周期中都会持续存在。

不过,对char*的隐式转换是不赞成的,更改内容将导致未定义的行为。我建议您退回const char*std::string

在这两种情况下,都返回char*

第一次返回一个指向位于堆栈上的局部数组变量的指针,该变量在退出函数后不再存在。并且可以被重写。

在第二步中,您返回一个位于代码段上的常量字符串的指针,只要程序运行,它就会存在。