动态分配字符串文字

dynamically allocate string literal

本文关键字:文字 字符串 动态分配      更新时间:2023-10-16

我想知道是否可以动态分配字符串文字?

我知道你能做

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=新字符("你好");

您声明了一个指向字符串的指针,但为其指定了一个常量字符值,这是不可能的。