这里没有问题:
int *x;
x = (int *) malloc(0 * sizeof(int));
int value = 5;
x = (int *) realloc(x,(value)*sizeof(int));
但我不能为字符串做这件事:\
我想为y []数组执行此操作,如下所示:
y[0]="hello"
y[1]="how are you"
我该怎么做?
答案 0 :(得分:10)
std::vector<std::string> y;
y.push_back("hello");
y.push_back("how are you");
请勿在C ++中使用malloc
,realloc
或free
。不要将char*
用于互操作以外的目的。在你真正需要它们之前远离指针(对于数组也一样)。
答案 1 :(得分:2)
您不能在realloc
对象数组上使用std::string
,因为realloc
通过位复制来移动东西,而这在常规对象上是不允许的。
标准类std::vector
是对象的通用容器,可以正确地移动和复制事物(使用复制构造函数,赋值和类似方法),并且可以使用resize
方法更改其大小。根据需要自动分配和释放所有需要的内存。
以std::vector
为例,您可以编写类似......
std::vector<std::string> v; // An empty vector
v.resize(10); // Now size is 10 elements (all empty strings "")
v[0] = "Hello"; // First element is now the string "Hello"
v[1] = "world."; // Second element is now the string "world."
v.resize(2); // Now v.size() is 2
v.push_back("How's going"); // Now the size is 3 and third element is filled.
帮自己一个忙,然后选择a good C++ book,阅读封面以覆盖。 C ++是一种功能强大但复杂的语言,如果你试图通过试验编译器来学习它,那么你会犯很多错误。
答案 2 :(得分:1)
你现在正在做的不是C ++ ...你可以用C风格的字符串做你想做的事情,但你需要一个指向char
类型的指针数组,允许你访问分配的数组中每个字符串的内存。这可以这样做:
char* y[2];
y[0] = strdup("hello");
y[1] = strdup("how are you");
您还需要记住,您的y
数组现在“拥有”指针,因此您必须在数组中的每个指针上调用free()
,以避免任何内存泄漏,如果您决定更改每个指针指向的字符串。
如果您想使用惯用的C ++解决方案,而不是恢复为C风格的字符串,那么您应该使用std::string
和std::vector
...这样做可以避免内存问题泄漏以及分配和释放与动态分配的C字符串相关联的内存。
答案 3 :(得分:0)
您实际上可以完全按照整数执行所需的操作:
typedef const char *c_string;
c_string *y;
y = (c_string *) malloc(0 * sizeof(c_string));
int value = 5;
y = (c_string *) realloc(y,(value)*sizeof(c_string));
y[0]="hello";
y[1]="how are you";
但这不适用于非const char *
,所以这个例子的可用性有限。