使用带有2d数组的malloc(),没有得到预期的结果

时间:2014-02-12 03:47:10

标签: c arrays malloc multidimensional-array

程序将另一个函数的malloc'd char *转换为malloc'd heigth x width网格。我不禁想到这就是我填补网格错误的方式。为了调试我添加了正在进行的操作的打印。在与其后面的相同循环进行比较时,结果是不同的(代码之后的结果)。我不明白为什么我分配的内存看起来像是在它之后被改变了。

我已经看了这么久,现在我的脑子一片空白。

void fill_grid ( char **g, FILE *file_in, int *w, int *h )
{


char *temp_row;
for( int i = 0 ; i < *h ; ++i ){
    (read_next(&temp_row, file_in));
    for( int j = 0 ; j < *w ; ++j ){
        (*g)[i * *h + j] = (temp_row)[j];
        printf("%c", (*g)[i * *h + j]);
    }
    printf("\n");
}

printf("WHYYYY IS THIS :\n");
for( int i = 0 ; i < *h ; ++i ){
    for( int j = 0 ; j < *w ; ++j ){
        printf("%c", (*g)[i * *h + j]);
    }
    printf("\n");
}
free(temp_row);

在main()

char *grid;
grid = malloc(sizeof(char)*grid_w*grid_h);
fill_grid( &grid, file_grid, &grid_w, &grid_h );

结果在shell中,第一个“网格”与.txt文件完全一样,第二个我假设是我分配的内存状态(分成两半而且很奇怪):

123456789999
123456789999
111111111999
123456789999
222222222999
123456789999
WHYYYY:
123456123456
123456111111
111111123456
123456222222
222222123456
123456789999

我希望有人能理解这一点,并指出我显然错过了什么。 感谢。

编辑:多余的()

1 个答案:

答案 0 :(得分:1)

替换

(*g)[i * *h + j]

(*g)[i * *w + j]

你的2d阵列(w宽h高)有一个“stride”w;也就是说,要转到下一行,您需要使用正好的w元素前进。