动态分配字符串文字
dynamically allocate string literal
我想知道是否可以动态分配字符串文字?
我知道你能做
char * letter = new char('b');
但是有可能像那样分配字符串文字吗
例如:
char * letter = new char("Hello");
您可以也应该使用std::string并从类似的文字中初始化它
std::string mystring{"Hello"};
当您这样做时,mystring
会在堆栈上分配,并且它的内容会从"Hello"
初始化(可能是通过复制它,但要了解小字符串优化或短字符串优化)。
当该字符串被销毁时(例如,在包含块的末尾),其存储(如果制作了内部副本,可能还有内部副本)将被释放。
如果你坚持要有一个指向堆分配的C字符串的指针,你可以使用strdup
(然后用free
而不是delete
释放它);如果你想要一个char
的原始数组,你可以使用
char* p = new char[sizeof("Hello")]; // or new char[6]
strcpy(p,"Hello");
但这只适用于像"Hello"
这样的文字字符串,并且您应该使用两次相同的文字字符串"Hello"
(或者使用strlen("Hello")+1
而不是sizeof("Hello")
,因为终止的是零字节)。
请注意,在任何情况下,都不会动态分配字符串文字。编译器被允许(而且经常这样做)将文本字符串放在生成的二进制可执行文件的只读代码段中。您可以做的是在堆中分配一个内存区域,该内存区域填充了该文本字符串的副本(或使用指针const char* pc = "hello";
)
您可以从不动态或以其他方式分配文本。文字就是文字;根据定义,它们是烘烤而成的。
您当然可以动态地分配char
,并从文本初始化它,就像您在示例中所做的那样。
至于你的问题,从字符串文字初始化有点棘手,因为你只能使用正常的初始化语法从字符串文字的初始化中获得自己的char[N]
:
char[] str = "hello"; // special rules apply here
并且不可能初始化动态分配的阵列。在new[]
语法中没有办法做到这一点。
您可以动态地分配一个指向字符串文字的指针:
const char** s = new const char*("hello");
但那完全没用。
我认为你能得到的最接近的是:
char* str = new char[5]{'h','e','l','l','o'};
但是,老实说,只需使用std::string
即可:
std::string str("hello");
它是专门为解决这类问题而发明的。
像这样尝试
int size = 6;
char * letter = new char[size];
strcpy(letter, "Hello");
std::cout << letter;
delete[] letter;
但请记住删除您的变量,因为在本例中,您的变量"letter"在"heap"中分配
string* p=new string {"Dynamically allocated string"};
字符串可以使用上述语法动态分配
不是因为当你在写时
char*letter=新字符("你好");
您声明了一个指向字符串的指针,但为其指定了一个常量字符值,这是不可能的。
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 如何使用字符串文字作为宏参数
- 有没有办法从非C/C++文件中读取C++原始字符串文字的内容
- 构造<int>具有 2 个字符串文字的向量
- 初始化或分配空字符串文字到指向 C 中的 char 的指针或指向 C++ 中 const char 的指针的原因是什么
- 方便地对C++中的所有字符串文字进行模糊处理
- 比较 std::string 和 C 样式字符串文字
- 如何从char16_t字符串文字中读取双精度?
- 如何在 C 宏中将变量字符串与文字字符串连接起来?
- 我如何知道 boost::any 是否包含文字字符串
- C 专用模板功能接收文字字符串
- 如何使变量成为文字字符串
- 可以一个#define一个文字字符串,其中包含用于资源文件的非ANSI字符的字符串
- 从文字字符串生成编译时常量整数
- 当一个函数可以被赋予一个 char* 或文字字符串时,声明这个函数的正确方法是什么?
- 如何在 C 或C++宏中使用函数作为文字字符串
- GCC中可能的错误:结构中的文字字符串类型
- 文字字符串有效,但字符串在 file.open() 中不起作用
- C/C++:文字字符串中"xNNN"格式的固有歧义
- constexpr函数中声明为静态的文字字符串