【问题标题】:Problems when dynamically allocating a matrix in memory在内存中动态分配矩阵时的问题
【发布时间】:2019-09-30 17:19:19
【问题描述】:

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

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

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

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

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

【问题讨论】:

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

标签: c pointers matrix malloc double-pointer


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-19
    • 2015-11-23
    • 2011-06-10
    • 1970-01-01
    • 1970-01-01
    • 2021-10-28
    • 2019-12-18
    • 2018-03-07
    相关资源
    最近更新 更多