2015-06-03 52 views
2

我有fullNames,這是在已分類的全名二維陣列之外,我想複製其內容納入sortedNames,這是一個真實存在的二維數組在這個函數的外面。 (我得到***sortedNames作爲參數)。複製一個二維數組到一個動態分配的二維數組功能

我動態分配這個數組,但複製不成功。第4次嘗試將名稱從fullNames複製到sortedNames後程序崩潰。爲什麼?

stringcpystringlen是我創建的函數。他們做的事情與strcpystrlen一樣。

/*allocating memory for sortedNames*/ 
*sortedNames = (char**) malloc(n);/*n is the number of names*/ 

/*allocating memory for each sortedNames array*/ 
for (i = 0; i < n; i++) 
{ 
    (*sortedNames)[i] = (char*) malloc(stringlen(fullNames[i])+1); 
} 


/*Copying fullNames into sortedNames*/ 

for (i = 0; i < n; i++) 
{ 
    stringcpy((*sortedNames)[i],fullNames[i]); 
} 
+0

是N名的個數或總規模要分配> –

+2

[強制性提醒關於不鑄造用C的malloc的reuslt](HTTP://計算器.COM /問題/ 605845/DO-I-鑄造了對結果的-的malloc)。 –

+0

您應該修改您的問題以包含函數原型。它是'void myfunction(char *** sortedNames,const char ** fullNames,size_t n)'? – chqrlie

回答

4

你不分配的指針數組足夠的內存,您應該分配是這樣的:

*sortedNames = (char**)malloc(n * sizeof(char *)); 

此外,爲什麼不到位的stringlenstringcpy使用strlenstrcpy?這只是一個錯字或做這些功能執行一些額外的功能?

關於對malloc返回值的轉換,你可以刪除它,如果你不打算把代碼編譯爲C++和寫:

*sortedNames = malloc(n * sizeof(**sortedNames)); 

關於圍繞**sortedNames額外的括號,要知道,他們是沒有必要,所以你可以刪除它們或不取決於你的本地風格的約定。

+2

[不要在C中使用malloc的reuslt強制提醒](http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc)。 –

+0

或簡單的'* sortedNames = malloc(n * sizeof ** sortedNames);' –

+0

@ Paul R:我不同意,特別是考慮到問題中缺乏信息。我們無處知道'sortedNames'的類型。如果類型確實不是'char *** sortedNames'或等價的,則顯式強制轉換將阻止編譯。 – chqrlie

0

應該進行2次編輯,因爲分配的內存可能不足。此代碼:

(*sortedNames)[i] = (char*) malloc(n); 

分配內存爲n個字節田地你需要的內存(N *字符串的大小)bytes.The第二的malloc可能工作爲char佔用1個字節。但是嘗試使用sizeof()使其獨立於系統。

正確的代碼將是:

(*sortedNames)[i] = malloc(n*sizeof(char *)); 
+1

需要@PaulR的相同評論:-) –

+1

爲什麼,哦,爲什麼,你**投malloc ** - >不。意義**擺脫**'(char *)'。 –

+0

我不同意,特別是考慮到問題中缺乏信息。我們無處知道'sortedNames'的類型。如果類型確實不是'char *** sortedNames'或等價的,則顯式強制轉換將阻止編譯。 – chqrlie