2012-01-05 90 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()' 编