带字符串或char的动态分配(数组)

时间:2011-10-11 19:04:51

标签: c++ arrays string dynamic

这里没有问题:

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"

我该怎么做?

4 个答案:

答案 0 :(得分:10)

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

请勿在C ++中使用mallocreallocfree。不要将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::stringstd::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 *,所以这个例子的可用性有限。