Sri*_*tha 4 c++ string pointers
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; }
Run Code Online (Sandbox Code Playgroud)
这是安全的,然后将数据"指向字符串的指针"存储在存储器中.
char[]和char*变量声明之间存在差异.正如您在代码中的注释中所指出的那样,在堆栈上char a[]分配内存a并将字符复制到该数组,实质上使声明与以下内容相同:
char a[] = {'A', 'r', 'r', 'a', 'y', ' ', 'o', 'f', ..., '\0'};
Run Code Online (Sandbox Code Playgroud)
当函数退出时,堆栈上为阵列分配的内存消失了,不再能通过指针引用它.
当通过delcaring变量时char* b,静态分配的char数组的地址存储在指针的存储器中b.分配字符串的实际内存不是由标准指定的,但是在整个代码执行过程中都可以访问(事实上,如果你声明另一个char*具有完全相同字符串的变量,编译器可能会重用该内存) - 所以它传递该地址是安全的(例如,作为函数的返回值).
正如Rob指出的那样,你应该声明指针的类型,const char*以避免意外地尝试写入存储字符串的内存:标准不保证将其放在内存的可写段中.如果需要更改它,则需要动态分配内存,将字符串复制到分配的内存中并返回/使用它.