将指向字符串文本的指针返回给调用方是否安全
Is it safe to return a pointer to a string literal to the caller?
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; }
这是安全的意思,那么数据"指向字符串的指针"将存储在内存中。
是的,返回 b
的值是安全的。b
指向的字符串文本具有静态存储持续时间。
但是,您必须正确声明指针const
-。 b
必须const char*b
.
char[]
和char*
变量声明之间存在差异。 正如您在代码中的注释中所指出的,char a[]
为堆栈上的a
分配内存并将字符复制到该数组,实质上使声明与以下内容相同:
char a[] = {'A', 'r', 'r', 'a', 'y', ' ', 'o', 'f', ..., ' '};
当函数退出时,堆栈上为数组分配的内存将消失,不再可以通过指针安全地引用。
当通过char* b
对变量进行解冻时,静态分配的char数组的地址存储在指针b
的内存中。 分配字符串的实际内存不是由标准指定的,但在整个代码执行过程中都可以访问(事实上,如果您使用完全相同的字符串声明另一个 char*
变量,编译器可能会重用该内存(——因此传递该地址是安全的(例如作为函数的返回值(。
正如 Rob 指出的那样,您应该声明指针的类型const char*
以避免意外尝试写入存储字符串的内存:标准不能保证它已被放置在内存的可写段中。 如果需要更改它,则需要动态分配内存,将字符串复制到分配的内存中并返回/使用它。
相关文章:
- 如何检查在编译时是否调用了模板化方法?
- 通过引用传递对象时是否调用复制构造函数?
- 如何在类中检查是否调用宏
- 传递类 by-value 时,调用方或被调用方是否调用析构函数
- 如何检查是否调用了成员方法
- c++ 运算符 new[]/delete [] 是否调用运算符 new/delete?
- Lvalue和Literal之间的比较是否调用Lvalue到Rvalue的转换
- 编译器如何知道是否调用 const 重载
- stl 优先级队列中的堆管理是否调用复制构造函数
- TCP套接字:在发送之前检测对等方是否已关闭?(Linux)
- 此代码是否调用不存在的构造函数?
- 以下 C/C++ 代码是否调用未定义的行为
- Type t=Type()是否调用复制构造函数
- 检查是否调用了复制构造函数
- 我能知道调用方是否保留了共享指针的副本吗?
- 以下代码是否调用未定义的行为
- std:map 析构函数是否调用键析构函数以及值析构函数?
- 将指向字符串文本的指针返回给调用方是否安全
- 当我在extern c中创建对象时,是否调用了c++类析构函数
- 是否会共享调用方/被调用方堆栈帧的部分