【问题标题】:Is it safe to return a pointer to a string literal to the caller?将指向字符串文字的指针返回给调用者是否安全?
【发布时间】:2012-04-02 17:35:20
【问题描述】:
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; }

这是安全的方法,然后数据“指向字符串的指针”将存储在内存中。

【问题讨论】:

标签: c++ string pointers


【解决方案1】:

是的,返回b 的值是安全的。 b 指向的字符串字面量具有静态存储持续时间。

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

【讨论】:

    【解决方案2】:

    char[]char* 变量声明之间存在差异。正如您在代码中的注释中指出的那样,char a[] 在堆栈上为a 分配内存并将字符复制到该数组,基本上使声明与以下内容相同:

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

    当函数退出时,在堆栈上为数组分配的内存已经消失,不再可以安全地通过指针引用。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-27
      • 2011-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-02
      相关资源
      最近更新 更多