返回局部char*和char[]的不同行为
different behaviour of returning local char* and char[]
我想这是存储/定义的差异,但我仍然找不到对行为的直接解释。我有一个函数,它以两种方式返回本地定义的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*
第一次返回一个指向位于堆栈上的局部数组变量的指针,该变量在退出函数后不再存在。并且可以被重写。
在第二步中,您返回一个位于代码段上的常量字符串的指针,只要程序运行,它就会存在。
相关文章:
- 为什么 Serial.println(<char[]>);返回随机字符?
- 从函数返回const char*数组
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 在 Arduino 上使用 sscanf 会导致与 const char * 不匹配,并且返回值始终相同,尽管输入值不同
- 将传入的网络"char*"数据转换为"uint8_t"并返回的安全方法是什么?
- 使用 map<char,strring> 的迭代器返回指针 map<char,strring>*
- 错误:为"运算符 std::string {aka std::__cxx11::basic_string}"指定的返回类型<char>
- C++函数返回两个 char 数组的相同索引元素
- 为什么 char 数组在从 C++ 中的函数返回时会丢失?
- 为什么类型 char 返回不同的值?
- 内存浪费?如果main()应该只返回0或1,那么为什么main是用int而不是短int甚至char声明的
- 从内部使用静态 std::string 的函数返回 const char * 是否安全?
- 从类方法返回 "const char*" 作为 std::string&
- 使用 ctypes 从函数返回字符串C++会给出大的 int,而不是 char 指针
- boost::hash/std::tr1::hash 不为复制的 const char* 返回相同的哈希
- 具有返回值 char* 返回垃圾的函数
- C++动态内存分配.将动态分配的 char* 返回变量数组分配给 char 变量
- Char 返回奇怪的输出C++
- 使用reinterpret_cast从char*返回long long
- try-catch对char**返回值有影响