我想知道是否可以动态分配字符串文字?
我知道你能够做到
char * letter = new char('b');
但是可以像这样分配字符串文字
例如:
char * letter = new char("Hello");
答案 0 :(得分:2)
您可以从不分配文字,动态或其他方式。文字是文字;它们根据定义进行了烘焙。
您可以动态地分配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");
它是专门为解决这些问题而发明的。
答案 1 :(得分:1)
您可以而且应该做的是使用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"
两次(或使用{{1而不是strlen("Hello")+1
,这是6,因为终止零字节。)
请注意,在所有情况下,您永远不会动态分配字符串文字。允许编译器(并且经常)将文字字符串放在生成的二进制文件code segment的只读executable中。您可以做的是在堆中分配一个内存区域,该区域填充了该文字字符串的副本(或使用指针 sizeof("Hello")
)
答案 2 :(得分:0)
试试这个
int size = 6;
char * letter = new char[size];
strcpy(letter, "Hello");
std::cout << letter;
delete[] letter;
但请记住删除您的变量,因为在此示例中您的变量是&#39;字母&#39;分配在&#39; heap&#39;
答案 3 :(得分:-2)
不,不是因为你在写作时
char * letter = new char(“Hello”);
您正在声明一个指向字符串的指针,但是为其指定一个不可能的常量char值。