2012-04-02 50 views
4
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; } 

这是安全的意思,那么数据“指向字符串的指针”将存储在内存中。将指向字符串的指针返回给调用者是否安全?

+1

可能的重复[http://stackoverflow.com/questions/2327841/c-string-literal-data-type-storage](http://stackoverflow.com/questions/2327841/c-string-literal-数据类型存储) – jrok 2012-04-02 17:39:06

+0

另请参阅:http://stackoverflow.com/questions/349025/is-a-string-literal-in-c-created-in-static-memory – 2012-04-02 17:39:28

+5

请注意,实际上,您正在编写C代码,不用介意'std :: cout'。这有缺点。其中之一是字符串处理相当复杂和危险。 (对于初学者'b'应该是一个'const char *';尝试修改它的调用者将炸毁地球,返回'a'也是一个灾难,并且返回一个动态分配的字符数组成为维护噩梦。你有没有考虑过使用'std :: string'?这样做,这些问题就会消失。 – sbi 2012-04-02 17:46:01

回答

9

是的,返回b的值是安全的。 b点的字符串文字具有静态存储持续时间。

但是,您必须正确地声明指针constb必须是const char*b

5

变量声明的char[]char*之间有区别。当你在代码中的注释指出,char a[]分配为a栈上的内存和copyies的字符数组,从根本上让相同的声明:

char a[] = {'A', 'r', 'r', 'a', 'y', ' ', 'o', 'f', ..., '\0'}; 

当函数退出时,内存分配在数组的栈上消失了,不再通过指针指向它是安全的。

当通过char* b对变量进行分类时,静态分配的char数组的地址存储在指针b的存储器中。分配字符串的实际内存不是由标准规定的,而是在整个代码执行过程中都可以访问(事实上,如果你用另一个变量char*声明了完全相同的字符串,编译器可能会重用该内存) - 所以传递该地址是安全的(例如,作为函数的返回值)。

正如Rob指出的那样,您应该声明指针const char*的类型,以避免意外地尝试写入存储字符串的内存:标准不保证已将其放置在字符串的可写段中记忆。如果您需要更改它,则需要动态分配内存,将该字符串复制到分配的内存中,然后返回/使用该内存。