C++ 如何制作一个数组来存储大小可变的字符数组?

C++ 如何制作一个数组来存储大小可变的字符数组?,c++,arrays,variables,multidimensional-array,size,C++,Arrays,Variables,Multidimensional Array,Size,我需要一个数组来存储大小可变的字符数组。我可以使用向量或其他任何东西,但不幸的是,这是一个MPI项目,我被迫使用数组,以便使用MPI::COMM_WORLD.send(…)函数发送它 我的想法来自 这是我遇到的问题的一个简化示例: char* arrayStorage[3]; //I want to store 3 char arrays of variable size! int index = 0; char array_1[RANDOM_SIZE] = {.....}; char arr

我需要一个数组来存储大小可变的字符数组。我可以使用向量或其他任何东西,但不幸的是,这是一个MPI项目,我被迫使用数组,以便使用
MPI::COMM_WORLD.send(…)
函数发送它

我的想法来自

这是我遇到的问题的一个简化示例:

char* arrayStorage[3]; //I want to store 3 char arrays of variable size!
int index = 0;

char array_1[RANDOM_SIZE] = {.....};
char array_2[RANDOM_SIZE] = {.....};
char array_3[RANDOM_SIZE] = {.....};

arraySorage[index] = array_1;
index++;    
arraySorage[index] = array_2;
index++;
arraySorage[index] = array_3;
index++;
我也见过人们谈论malloc之类的东西,但我对指针知之甚少。我是malloc,我必须打免费电话,我不知道在哪里,所以我现在要避免

这段代码显然不起作用,
array\u 1
array\u 2
array\u 3
都可以,但当我试图访问它们时,会收到垃圾。问题似乎在索引变量内部。也许我不应该做index++,也许我应该做index++=RANDOM_SIZE,但这也失败了

如何在数组中存储可变大小的字符数组?

使用malloc和free(或在C++中使用new和delete)。你也可以用向量来做,因为向量可以被当作数组

 char *str = "hello world";
 // need the +1 for null character
 arraySorage[0] = (char *)malloc (strlen(str) + 1); 
 strcpy(arraySorage[0], str);
 ...
 free(arraySorage[0]);
新增/删除

arraySorage[0] = new char[strlen(str)+1];

strcpy(arraySorage[0], str);
...
delete arraySorage[0];

使用向量和STD::string是正确的C++方式,原因很多,包括内存不泄漏和异常处理正确。你应该学会如何使用malloc和free,这并不难。@bleepblop:视情况而定。在混合使用MPI时,他可能实际上需要

MPI\u Alloc\u mem
,这有时正好相当于
malloc
。我不知道MPI,但std::vector的内容是一个数组,对吗?无论向哪个发送函数传递数据,都可以向其传递std::vector::data()指针(向量大小),这显然等同于自己分配数组并传递它确保结尾('\0')处有一个null终止字符-这是在c/c++中处理字符串的正确方法,您不必执行任何操作。你应该为这项工作选择最好的工具。而
malloc
则是完美的“轻”。请记住,可理解性也是“轻”代码中的一个因素。我不能使用向量,我知道它们,我想到它们,但我不能通过MPI发送如此沉重和复杂的对象,即使它们表示的概念像数组一样简单。至于答案,它让我意识到我的问题表达得很糟糕,我为此感谢你。我也不明白为什么我“必须”使用malloc或new。有人能解释吗?@Flame\u Phoenix:你为什么认为你不能使用向量?MPI::COMM_WORLD.Send函数将指针和长度作为参数。你可以从vector类中得到这两个。是的,你可以。正如上面Nicholas Wilson所述,如果使用C++11,您可以调用std::vector::data方法来获取指向底层数组的指针。如果您使用的是较旧的编译器(C++11之前),则可以通过获取向量第一个成员的地址来获取指针,如下所示:char*arrayPtr(&myVector[0]);像这样使用向量是个坏主意,如下所述:。另一种方法是使用MPI Boost,这也是我不能使用的:用描述的方式使用向量不是一个坏主意——C++标准保证了一个Ad:ST::向量将数据存储在相邻的内存中。