char* stringReturn()
{
char a[] = "Array of characters";
//return a; // I know stack allocation should not be returned
char *b = "Pointer to a string";
return b; // Is it safe ?
}
int main() {
char *str = stringReturn ();
cout<< str;
return 0; }
这是安全的,然后数据“指向字符串的指针”将存储在内存中。
答案 0 :(得分:9)
是的,可以安全地返回b
的值。 b
指向的字符串文字具有静态存储持续时间。
但是,你必须正确地声明你的指针const
。 b
必须为const char*b
。
答案 1 :(得分:5)
char[]
和char*
变量声明之间存在差异。正如您在代码中的注释中所指出的那样,char a[]
在堆栈上为a
分配内存并将字符复制到该数组,实质上使声明与以下内容相同:
char a[] = {'A', 'r', 'r', 'a', 'y', ' ', 'o', 'f', ..., '\0'};
当函数退出时,堆栈上为数组分配的内存消失了,不再能通过指针引用它。
当通过char* b
来传递变量时,静态分配的char数组的地址存储在指针b
的内存中。分配字符串的实际内存不是由标准指定的,但可以在代码执行期间访问(实际上,如果使用完全相同的字符串声明另一个char*
变量,编译器可能会重用该内存) - 因此传递该地址是安全的(例如,作为函数的返回值)。
正如Rob所指出的那样,你应该声明指针const char*
的类型,以避免意外地尝试写入存储字符串的内存:标准不能保证将它放在可写的内容中记忆的一部分。如果需要更改它,则需要动态分配内存,将字符串复制到分配的内存中并返回/使用它。