在下面的代码示例中,动态分配整数的内存,并将值复制到新的内存位置。
main() {
int* c;
int name = 809;
c = new int(name);
cout<<*c;
}
但是,当我尝试用char字符串做同样的事情时,它不起作用。 这是为什么?
int main() {
char* p;
char name[] = "HelloWorld";
p = new char(name);
cout << p;
}
答案 0 :(得分:2)
您的第二个示例不起作用,因为char数组与整数变量的工作方式不同。虽然可以通过这种方式构造单个变量,但这不适用于(原始)变量数组。 (正如你所观察到的那样。)
在C ++中,你应该尽量避免处理指针和原始数组。相反,您宁愿使用标准库容器将该字符串的副本复制到动态分配的内存数组中。在这种情况下,std::string
和std::vector<char>
特别适合。 (应该首选哪一个取决于语义,但可能是std::string
。)
以下是一个例子:
#include <string>
#include <vector>
#include <cstring>
#include <iostream>
int main(){
char name[] = "Hello World";
// copy to a std::string
std::string s(name);
std::cout << s << '\n';
// copy to a std::vector<char>
// using strlen(name)+1 instead of sizeof(name) because of array decay
// which doesn't occur here, but might be relevant in real world code
// for further reading: https://stackoverflow.com/q/1461432
// note that strlen complexity is linear in the length of the string while
// sizeof is constant (determined at compile time)
std::vector<char> v(name, name+strlen(name)+1);
std::cout << &v[0] << '\n';
}
输出结果为:
$ g++ test.cc && ./a.out
Hello World
Hello World
供参考:
答案 1 :(得分:1)
您的第二个代码段不起作用,因为new int(name)
初始化了来自int
的{{1}},而int
尝试从{new char(name)
初始化char
1}}数组。
没有数组构造函数在C ++中使用数组。为了制作数组的副本,您必须分配一个数组,然后将数据复制到其中:
char[11]
答案 2 :(得分:1)
在第一种情况下,您为单个int对象分配内存,并使用单个int值进行初始化。太棒了,这很有效。
在第二种情况下,您为单个char对象分配内存,并使用字符数组对其进行初始化。它不起作用,一个对象数组不适合单个对象的内存。此外,数组有不同的类型,因此初始化是不正确的。
要为字符数组(例如字符串)分配内存,可以使用new[]
:
char* ptr = new char[11]{"HelloWorld"};
PS。 GNU编译器(至少在当前版本7之前)和clang(直到版本4)都有一个错误,它会破坏上面的初始化。解决方法是在分配后复制字符串。
PPS。虽然学习这些东西很有用,但不要在实际程序中进行手动内存管理。对于字符串使用std::string
等RAII容器,对单个动态对象使用std::unique_ptr
。
答案 3 :(得分:0)
当您尝试初始化char而不是字符数组时,您的代码不起作用。为了动态分配内存,您需要分配内存然后复制内容。
p = new char[strlen(name) +1];
std::strcpy(p, name);