返回本地char *和char []的不同行为

时间:2014-10-14 14:47:21

标签: c++ c

我猜它的存储/定义差异,但我仍然无法找到行为的直接解释。我有一个函数,它以两种方式返回本地定义的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 ++),而在第二个函数中它会打印正确的数据。 我知道我应该在这样的情况下将数据存储在堆上或者定义静态变量,但是,第二个怎么做呢?而且,我可以依靠第二种方式始终工作吗?

2 个答案:

答案 0 :(得分:2)

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

第二个可行,因为"The data 100"是一个具有静态存储持续时间的字符串文字,这意味着它会持续整个程序的生命周期。

虽然不推荐将char*隐式转换,但更改内容将导致未定义的行为。我建议您返回const char*std::string

答案 1 :(得分:0)

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

首先返回指向堆栈的本地数组变量的指针,退出函数后该变量不再存在。并且可能会被重写。

在第二个中,返回指向代码段上的const字符串的指针,只要程序正在运行,它就会存在。