在内存中动态分配矩阵时的问题

时间:2019-05-13 17:54:59

标签: c pointers matrix malloc double-pointer

很抱歉,标题在这个问题上不够具体,但是我在使用双指针时确实遇到了一些奇怪而又不一致的问题,而且我不知道该如何用一句话来形容。

>

基本上,每次我的程序运行时,它都会分配一个矩阵,该矩阵的大小是动态生成的。

coord mapSize;

mapSize.row = randomRange(3, 5);
mapSize.column = randomRange(5, 7);

char** map = (char**) malloc (mapSize.row * sizeof(char));

for (int i = 0; i < mapSize.row; i++) 
{
    map[i] = (char*) malloc (mapSize.column * sizeof(char));
}

然后初始化矩阵:

for (int i = 0; i < mapSize.row; i++)
{
    for (int j = 0; j < mapSize.column; j++)
    {
        map[i][j] = CLEAN_FLOOR_SYMBOL;
    }
}

只要矩阵的大小不超过4行,这就可以完美地工作。如果发生这种情况,则程序只会在初始化到达第五行时崩溃。奇怪的是,即使行数大于5,当初始化到达第五行时仍然会出现问题。

我已经通过在初始化循环中打印出一些值来验证了这一点。

printf("r: %d c: %d\n\n", mapSize.row, mapSize.column);

for (int i = 0; i < mapSize.row; i++)
{
    printf("r: %d | c: ", i);
    for (int j = 0; j < mapSize.column; j++)
    {
        map[i][j] = CLEAN_FLOOR_SYMBOL;
        printf("%d ", j);
    }
    printf("\n");
}

error

这里有6行,但是尝试初始化第五行时程序仍然崩溃。

更奇怪的是,在eclipse的控制台上运行程序时,似乎没有这些问题出现。那么,我怎么又搞砸了?

1 个答案:

答案 0 :(得分:2)

D

您缺少a = A(); a.print_me(),请don't cast the result of *alloc() *)

__init__

更好:

char** map = (char**) malloc (mapSize.row * sizeof(char));

因为这里的类型的大小是随着*的类型而变化的,所以如果必须更改,则不必记住在多个位置进行更改。

但是,如果您想要性能,请摆脱char **map = malloc (mapSize.row * sizeof(char*)); // ^ // here 。查找什么是锯齿状的数组并避免使用它:

char **map = malloc (mapSize.row * sizeof(*map));


*)如果编译器抱怨您正在使用C ++编译器来编译C代码。