我猜它的存储/定义差异,但我仍然无法找到行为的直接解释。我有一个函数,它以两种方式返回本地定义的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 ++),而在第二个函数中它会打印正确的数据。 我知道我应该在这样的情况下将数据存储在堆上或者定义静态变量,但是,第二个怎么做呢?而且,我可以依靠第二种方式始终工作吗?
答案 0 :(得分:2)
第一个是未定义的行为,因为当函数结束时释放arr
,所以你留下了一个悬空指针。
第二个可行,因为"The data 100"
是一个具有静态存储持续时间的字符串文字,这意味着它会持续整个程序的生命周期。
虽然不推荐将char*
隐式转换,但更改内容将导致未定义的行为。我建议您返回const char*
或std::string
。
答案 1 :(得分:0)
在这两种情况下,您都会返回char*
首先返回指向堆栈的本地数组变量的指针,退出函数后该变量不再存在。并且可能会被重写。
在第二个中,返回指向代码段上的const字符串的指针,只要程序正在运行,它就会存在。