2012-10-05 121 views
-2

我需要一个数组来存储可变大小的char数组。我可以使用向量或其他任何东西,但不幸的是,这是一个MPI项目,我不得不使用一个数组,所以我可以使用MPI::COMM_WORLD.Send(...)函数发送它。如何使数组存储可变大小的char数组?

我的想法来自this link

这是我有问题的一个简单的例子:

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,我不得不打电话free,我不知道在哪里,所以我现在回避。

这段代码显然不起作用,array_1,array_2,array_3都没问题,但是当我试图访问它们时,我得到了垃圾。问题似乎在索引变量内。也许我不应该做索引++,也许我应该做index + = RANDOM_SIZE,但那也失败了。如何在数组中存储可变大小的char数组?

+4

Nononononooooo。你应该简单地学习如何使用malloc和free,这并不难。 – 2012-10-05 16:06:21

+0

@BleepBloop:取决于。在MPI中,他实际上可能需要'MPI_Alloc_mem',有时完全等同于'malloc'。 – willglynn

+2

我不知道MPI,但一个std :: vector的内容是一个数组,对吧?无论您将数据传递给哪个send函数,都可以将它传递给std :: vector <> :: data()指针(使用向量的大小),这显然等同于自己分配数组并传递它。 –

回答

2

使用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++的方式,有许多原因,包括没有内存泄漏和异常的妥善处理。

+0

我不能使用矢量,我知道它们,我想到了它们,但我无法通过MPI发送沉重而复杂的物体,即使它们代表了一个像数组一样简单的概念。至于答案,这让我意识到我的问题制定得不好,我为此感谢你。我也不明白为什么我“要”使用malloc或new。有人可以解释吗? –

+2

@Flame_Phoenix:你为什么认为你不能使用矢量? MPI :: COMM_WORLD.Send函数将一个指针和一个长度作为参数。你可以从矢量类中得到两者。 – ScottTx

+0

是的,你可以。正如Nicholas Wilson上面所述,如果使用C++ 11,可以调用std :: vector :: data方法来获取指向底层数组的指针。如果您使用的是较旧的编译器(C++ 11之前版本),则可以通过获取向量的第一个成员的地址来获取指针,如下所示:char * arrayPtr(&myVector [0]); –