分配动态2D字符数组

时间:2012-01-05 06:00:37

标签: c multidimensional-array memory-management

gcc 4.6.2 c89

为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]);
    }
}

非常感谢任何建议,

4 个答案:

答案 0 :(得分:6)

两个主要问题:

第一期:

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

您在内循环的每次迭代中重新分配sdp_attributes[i] - 从而每次都覆盖它。你可能想要这个:

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';

答案 1 :(得分: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 - 循环,你分配了一个包含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值在传递时会被提升为intprintf())而不是作为控制角色。

(对于一对嵌套循环使用ij也更常规,并且ijk用于三重嵌套但是,这是一个非常小的问题。)

答案 2 :(得分:1)

为2d数组分配和分配元素的正确方法如下(但这是int数组,您可以尝试将其更改为char数组:

有一点需要注意:正如@Mysticial所提到的,你应该在int值中添加/减去'0',以便在使用char字符集时获得ASCII值(请记住我们的itoa()功能!)。

#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. 添加错误处理
  3. malloc()'内存必须为free()'ed

答案 3 :(得分: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);