使用字符串或字符动态分配(数组)

dynamic allocation (arrays) with string or char

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

这里没有问题:

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"

我该怎么做呢?

std::vector<std::string> y;
y.push_back("hello");
y.push_back("how are you");

不要在c++中使用mallocreallocfree。不要将char*用于除互操作之外的目的。在你真正需要指针之前,不要使用它们(数组也是如此)。

不能在std::string对象的数组上使用realloc,因为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.

帮自己一个忙,找一本好的c++书,从头到尾读一遍。c++是一门强大但复杂的语言,如果你试图通过尝试编译器来学习它,你会犯一个可怕的错误,原因有很多。

你现在正在做的不是c++…您可以对c风格的字符串做任何您想做的事情,但是您需要一个指向char类型的指针数组,以允许您访问数组中每个字符串分配的内存。可以这样做:

char* y[2];
y[0] = strdup("hello");
y[1] = strdup("how are you");

你还需要记住,你的y数组现在"拥有"指针,所以你必须在数组中的每个指针上调用free(),以避免任何内存泄漏,如果你决定改变每个指针指向的字符串。

如果你想用一个习惯的c++解决方案,而不是恢复到C风格的字符串,那么你应该使用std::stringstd::vector…这样做可以避免内存泄漏问题,以及分配和释放与动态分配的c -string相关的内存。

你可以做你想做的事情就像处理整数一样:

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 *,所以这个例子的可用性有限。