2015-11-06 62 views
0

這裏是我的代碼片斷來創建包含char數組的2D數組。如果有人能夠找出可能的原因,那將是非常好的。我曾嘗試使用malloc()calloc()分配內存到二維陣列,但沒有正面的跡象。2D char數組的malloc函數的分割錯誤

代碼段:

char** attrNames = (char **)malloc(3*sizeof(char*)) 
for (m = 0; m < 3; m++) { 
     attrNames[m] = (char *)malloc(2 * sizeof(char*)); 
     strcpy(schema->attrNames[m], temp_buff2[m]); 
    } 

我想分配內存,然後在一個循環持續,並再次分配內存和一個名爲temp_buff2變量中的數據複製(具有字符數據)到字符數組。

+0

沒錯。 '(char *)malloc(2 * sizeof(char *))'爲兩個指針分配空間,而不是它們指向的任何內容。 –

+0

你也可以這樣分配:'char ** attrNames = malloc(3 * sizeof * attrNames);'。在分配的指針中使用'sizeof'有助於防止意外的sizeof(type)'不匹配。同樣''attrNames [m] = malloc(2 * sizeof ** attrNames);'(調整包括'strlen'以得到正確的計數如上) –

+0

我不知道爲什麼,但他們都沒有工作 – Brinda

回答

0

請嘗試下面的代碼。儘管項目中的內存分配錯誤可能不太可能,但現在是開發良好錯誤處理反射的好時機 - 當您轉向更嚴肅的項目時,它會節省您的培根。

請注意,char *指針需要一個等於字符串長度和一個額外字節的緩衝區。 sizeof(char *)是一個很小的值,在64位體系結構中只有8個 - 它只是存儲字符串開始的內存地址的值。請注意,我們需要在strlen()之上設置+1,因爲strcpy()會將一個額外字節(\ 0)存儲爲字符串終結符。

char** attrNames = (char **)malloc(3*sizeof(char*)); 

if (!attrName) 
{ 
    // handle memory error 
} 

for (m = 0; m < 3; m++) { 
     attrNames[m] = (char *)malloc(strlen(temp_buff2[m])+1); 
     if (!attrNames[m]) 
     { 
      // handle memory error 
     } 

     strcpy(schema->attrNames[m], temp_buff2[m]); 
    } 

內存錯誤可以通過你的函數返回一個錯誤代碼或通過一個致命的退出這樣的處理:

fprintf(stderr, "Out of memory\n"); 
exit(1); 

您需要#include <stdlib.h>出境的原型()。

0

您需要爲「temp_buff2」中的任何內容預留足夠的空間。例如:

char** attrNames = (char **)malloc(3*sizeof(char*)) 
for (m = 0; m < 3; m++) { 
    attrNames[m] = (char *)malloc(strlen(temp_buff2[m]) + 1); 
    strcpy(schema->attrNames[m], temp_buff2[m]); 
} 

請注意,我將strlen結果加1,這是因爲我們需要爲空字符結束符保留一個額外的字節。