2012-10-05 331 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]); –