2012-01-05 117 views
1

gcc 4.6.2 c89分配動態2D字符陣列

爲2D數組分配內存並填充字符。

但是,我似乎並沒有填充,因爲當我打印什麼都沒有顯示。

我在這裏做錯了什麼?

char **attributes = NULL; 

/* TODO: Check for memory being allocated */ 
attributes = malloc(3 * sizeof(char*)); 
int i = 0; 
int k = 0; 

for(i = 0; i < 3; i++) { 
    for(k = 0; k < 5; k++) { 
     sdp_attributes[i] = malloc(5 * sizeof(char)); 
     sdp_attributes[i][k] = k; 
    } 
} 

for(i = 0; i < 3; i++) { 
    for(k = 0; k < 5; k++) { 
     printf("attributes[i][k] [ %c ]\n", attributes[i][k]); 
    } 
} 

非常感謝任何建議,

回答

6

兩個主要問題:

第一期:

for(i = 0; i < 3; i++) { 
    for(k = 0; k < 5; k++) { 
     sdp_attributes[i] = malloc(5 * sizeof(char)); 

您重新分配sdp_attributes[i]一t內循環的每次迭代 - 從而每次覆蓋它。你可能想要這個:

for(i = 0; i < 3; i++) { 
    sdp_attributes[i] = malloc(5 * sizeof(char)); 
    for(k = 0; k < 5; k++) { 

第二期:

sdp_attributes[i][k] = k; 

你基本上寫低ASCII字符。他們大多不打印。 這樣的事情可能會做你想要什麼:

sdp_attributes[i][k] = k + '0'; 
3

你可能想:

for (i = 0; i < 3; i++) 
{ 
    attributes[i] = malloc(5 * sizeof(char)); 
    for (k = 0; k < 5; k++) 
    { 
     attributes[i][k] = k; 
    } 
} 

這忽略錯誤檢查的分配。

它還修復了數組的名稱以匹配聲明,但是您的代碼要麼不編譯(除非您的問題是關於它爲什麼不編譯,否則不要編譯非編譯代碼!)或者您有另一個名爲sdp_attributes的變量宣佈某處,您沒有向我們展示。

您的代碼泄漏了很多內存。每次圍繞k -loop,您分配了一個由5個字符組成的新數組,並將指針存儲在attributes[i](或sdp_attributes[i])中,將新指針存儲在之前的指針上,以便覆蓋前4個指針的值。你不可能免費獲得前四項 - 他們失去了不可挽回的。另外,在最後一次迭代中,您初始化了最後一個數組的第5個元素,但之前的4個元素沒有初始化,因此包含了不確定的垃圾。此外,在您的打印循環中,數組中的值是控制字符^ @,^ A,^ B,^ C和^ D;這些不需要用%c(特別是不是^ @,也被稱爲NUL或'\0')打印得很好。該printf()語句可能更好的寫法如下:

printf("attributes[%d][%d] [ %d ]\n", i, k, attributes[i][k]); 

這將輸出數組索引(而不是簡單的人物[i][k]每個條目),並打印控制字符爲整數(因爲char值提升到int當傳遞到printf())而不是控制字符。

(它也更傳統的使用ij一對嵌套循環,並ij,並k的三重嵌套循環,等等。然而,這是一個很次要的問題。)

+0

是的,我將使用免費的。我的代碼片段只是保持簡短。 – ant2009 2012-01-05 06:04:59

0
for(i = 0; i < 3; i++) { 
    for(k = 0; k < 5; k++) { 
     sdp_attributes[i] = malloc(5 * sizeof(char)); 
     sdp_attributes[i][k] = k; 
    } 
} 

你每次擦除已分配的內存,你在最內層循環迴路。 這是一個正確的版本。

for(i = 0; i < 3; i++) { 
    sdp_attributes[i] = malloc(5 * sizeof(char)); 
    for(k = 0; k < 5; k++) { 
     sdp_attributes[i][k] = k; 
    } 
} 

你應該解決您的聲明:

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

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

不要忘記釋放所有的內存分配

for(i = 0; i < 3; i++) 
{ 
    free(sdp_attributes[i]); 
} 
free(sdp_attributes); 
1

的正確方法爲2d數組分配和分配元素如下所示(但這是一個int數組,你可以試着改變它char陣列):

有一點需要注意:由於@Mysticial提到的,你應該加/減「0」到您的int價值當使用ASCII字符集時(請記住我們的itoa()函數!),獲得char值。

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
     int row, column; 
     int **matrix; 
     int i, j, val; 

     printf("Enter rows: "); 
     scanf("%d", &row); 
     printf("Enter columns: "); 
     scanf("%d", &column); 

     matrix = (int **) malloc (sizeof(int *) * row); 
     for (i=0 ; i<row ; i++) 
       matrix[i] = (int *) malloc (sizeof(int) * column); 

     val=1; 
     for (i=0 ; i<row ; i++) { 
       for (j=0 ; j<column; j++) { 
         matrix[i][j] = val++; 
       } 
     } 

     for (i=0 ; i<row ; i++) { 
       for (j=0 ; j<column; j++) { 
         printf("%3d ", matrix[i][j]); 
       } 
       printf("\n"); 
     } 

     for (i=0 ; i<row ; i++) 
       free(matrix[i]); 
     free(matrix); 

     return 0; 
} 

幾點要注意:

  1. 錯誤處理應該malloc()
  2. malloc()加入 '版內存必須是free()' 編