我想知道是否可以动态分配字符串文字?动态分配字符串文字
我知道你能做到
char * letter = new char('b');
但有可能分配一个字符串字面一样,
例如:
char * letter = new char("Hello");
我想知道是否可以动态分配字符串文字?动态分配字符串文字
我知道你能做到
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")
,这是因为零字节的终止而为6)。
请注意,在所有情况下,您都不会动态分配字符串文字。允许编译器(并且经常)将文字字符串放在生成的二进制文件executable的只读code segment中。你可以做的是分配在堆充满一个存储区复制文字字符串的(或使用指针const char* pc = "hello";
)
谢谢,这是一个很好的解释。 – anerk 2015-03-03 12:28:27
不,它是不是因为当你正在写作
char * letter = new char("Hello");
你正在声明一个指向字符串的指针,但是给它赋值是一个不可能的常量字符。
那么没关系。 – anerk 2015-03-03 10:25:05
这是不正确的。实际上这是无意义的/毫无意义的。 – 2015-03-03 10:26:04
@ TheParamagneticCroissant:'错误:从'const char *'无效转换为'char'' – 2015-03-03 11:18:44
可以永远分配文字,动态或其他方式。文字是文字;它们是根据定义烘烤的。
您可以动态地分配一个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");
有人专门发明了解决这些各种问题。
感谢您的帮助! – anerk 2015-03-03 12:28:12
尝试这样
int size = 6;
char * letter = new char[size];
strcpy(letter, "Hello");
std::cout << letter;
delete[] letter;
但要记住删除您的变量,因为在“堆”
除2015年外,我们还没有多年使用原始的'new []'和'delete []'。 '自动字母(std :: make_unique
我知道!问题不是关于std :: string – Garnik 2015-03-03 11:28:08
这个问题是关于动态分配一个字符串。这是_is_'std :: string'。你在这里做的是教导过时和危险的方法。不负责任了! – 2015-03-03 11:28:30
什么编程语言,你问这个分配本示例,变量“信”? – Hybris95 2015-03-03 10:08:53
这是为C++。 – anerk 2015-03-03 10:09:55
你可以将你的只读字符串转换为一个新的动态分配的字符串缓冲区? – Evert 2015-03-03 10:13:07