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

标签 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,初始化到第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 的控制台上运行程序时,这些问题似乎都没有出现。那么,我怎么搞砸了?

最佳答案

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

您缺少一个*,请don't cast the result of *alloc() *):

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

更好:

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 代码。

关于c - 在内存中动态分配矩阵时的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56117559/

相关文章:

python - 如何通过行索引和列索引将元素插入到 Numpy 矩阵中

c++ - 为什么 timer_create 在 solaris 10 中为 SIGEV_THREAD 抛出错误?

c - 我的代码有什么问题?一元类型参数无效。双指针

c - 指向结构体指针的指针

list - 合并(合并)不同长度的向量

performance - 具有重叠的信号分割

c - POSIX 线程和信号掩码

c - 指向数组类型的指针,或者添加 "array decay to pointer"、 "typedef"、 "const"和 "*"时 "&"发生了什么

c++ - 调用成员函数而不初始化指针变量

c++ - 访问存储在指针变量指向的地址中的值(这是一个地址)返回垃圾值?