我动态分配的2D数组无法打印

时间:2019-07-02 21:24:43

标签: c arrays

我正在尝试使用一个函数来创建2D字符数组,将所有字符设置为字符x,并打印前10行以测试操作是否正确。

我的代码使用以下代码进行编译:gcc -std = c89 -pedantic code.c 但是,当我尝试使用./a.out运行代码时,出现了分段错误。

我已将问题隔离在尝试打印数组时,因为注释掉行printf("%c", a[i][j]);时没有分段错误。

#define rows 100
#define columns 3

char** makeArr(int rows, int columns)
{
    int temp,i,j;
    char** a = (char**)malloc(rows*sizeof(char*));
    for(temp = 0; temp < rows; temp++)
    {
        a[temp]=(char*)malloc(columns*sizeof(char));
    }

    memset(a, 'x', rows*columns*sizeof(a[0][0]));

    for(i = 0; i < 10; i++)
    {
        for(j = 0; j < columns; j++)
        {
            printf("%c", a[i][j]);
        }
        printf("\n");
    }

    return a;
}

对于此问题的任何帮助将不胜感激,如果需要更多上下文,请告诉我。

2 个答案:

答案 0 :(得分:2)

您可以将数组分配为连续块:

char (*arr)[COLUMNS] = malloc(sizeof *arr * ROWS);
memset(arr, 'x', sizeof *arr * ROWS);

memset调用超出了分配的数组a的范围:

memset(a, 'x', rows*columns*sizeof(a[0][0]));

该数组由char*指针组成,并具有rows元素。由于您要分别分配子数组,因此需要对每个memset指针进行单独的malloc调用。假设字符串的长度固定,那么将存储分配为一个连续的块会更简单。

答案 1 :(得分:1)

最简单的解决方案是在与memset行相同的循环中执行malloc

for(temp = 0; temp < rows; temp++) {
    a[temp] = malloc(columns*sizeof(char));
    memset(a[temp], 'x', columns);
}

请注意,我没有将columns * sizeof(a[0][0])乘以。 sizeof(a[0][0])char的大小,以字节为单位,因此通常为1。如果您要进行columns * sizeof(a[0][0]),它仍然可以在大多数系统上使用,但是在实际使用中,实际上并没有因为sizeof(char)几乎普遍为1,所以需要它。