Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 返回本地字符*和字符[]的不同行为_C++_C - Fatal编程技术网

C++ 返回本地字符*和字符[]的不同行为

C++ 返回本地字符*和字符[]的不同行为,c++,c,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

我想这是存储/定义的不同,但我仍然找不到对这种行为的直接解释。我有一个函数,它以两种方式返回本地定义的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++),而在第二个函数中,它打印正确的数据。
我知道我应该在这样的情况下将数据存储在堆上,或者定义静态变量,但是,为什么第一个变量不起作用,而第二个变量起作用呢?还有,我能指望第二种方法一直工作吗

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

首先返回一个指向本地数组变量的指针,该变量位于堆栈上,在退出函数后不再存在。并可能被改写


在第二个示例中,返回指向常量字符串的指针,该字符串位于代码段上,并且只要程序运行,它就存在

第一个是未定义的行为,因为函数结束时会释放
arr
,因此留下一个悬空指针

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


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

第一个是UB。基本上,您返回的是指向堆栈上声明的变量的指针,该变量不在范围内。这两种情况都有多个重复项。首先尝试搜索SO。字符串文字永远存在。请在关闭问题后不要添加子问题。通过发布一个新问题来问这些问题谢谢你的回答,我尝试创建一个ostringstream,然后从中返回一个字符串,它存在于调用函数中,据我所知,它不是字符串文字,所以为什么它仍然存在?@Anton.P这是未定义的行为,请阅读链接的问题。