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

C 在内存中动态分配矩阵时出现的问题,c,pointers,matrix,malloc,double-pointer,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

如果标题在这个问题上不够具体,我很抱歉,但是我在双指针方面遇到了一些非常奇怪和不一致的问题,我不知道如何用一句话来描述它们

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

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

coordmapsize;
mapSize.row=随机范围(3,5);
mapSize.column=随机范围(5,7);
char**map=(char**)malloc(mapSize.row*sizeof(char));
对于(int i=0;i
然后初始化矩阵:

for (int i = 0; i < mapSize.row; i++)
{
    for (int j = 0; j < mapSize.column; j++)
    {
        map[i][j] = CLEAN_FLOOR_SYMBOL;
    }
}
for(int i=0;i
只要矩阵的大小不超过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");
}
printf(“r:%d c:%d\n\n”,mapSize.row,mapSize.column);
对于(int i=0;i

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

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

您缺少一个
*
,请*):

更好:

char **map = malloc (mapSize.row * sizeof(*map));
在这里,类型的大小随着
map
类型的变化而变化,因此,如果类型发生变化,您不必记住在多个位置进行更改

但是,如果您想要性能,请摆脱
**
。查找什么是锯齿阵列并避免它:

size_t num_rows = // ...
size_t num_cols = // ...
char *foo = malloc(num_rows * num_cols * sizeof *foo);

// access:
size_t row = // ...
size_t col = // ...
foo[row * num_rows + col];

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

您缺少一个
*
,请*):

更好:

char **map = malloc (mapSize.row * sizeof(*map));
在这里,类型的大小随着
map
类型的变化而变化,因此,如果类型发生变化,您不必记住在多个位置进行更改

但是,如果您想要性能,请摆脱
**
。查找什么是锯齿阵列并避免它:

size_t num_rows = // ...
size_t num_cols = // ...
char *foo = malloc(num_rows * num_cols * sizeof *foo);

// access:
size_t row = // ...
size_t col = // ...
foo[row * num_rows + col];


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

可能重复的@cropi完全不是该问题的重复,尽管另一个问题可能被认为是这个问题的答案。@EOF也许您是对的。我之所以将其标记为duplciate,是因为上面的示例和链接基本相同-它们之间的区别只是变量类型。可能重复的@cropi根本不是该问题的重复,尽管另一个问题可能被认为是这个问题的答案。@EOF也许你是对的。我之所以将其标记为Duplicate,是因为上面的示例和链接基本相同——它们之间的区别只是变量类型。