【问题标题】:Problem with allocating multiplication table分配乘法表的问题
【发布时间】:2019-11-13 01:39:04
【问题描述】:

我需要编写一个程序来为乘法表分配内存。问题是 malloc、calloc 和 realloc 的单个调用限制为 80 个字节,我不知道如何分阶段分配内存。 如果有人可以帮助我,我将不胜感激。

这是我已经尝试过的。如果我在一次调用中分配 400 个字节的内存,它就可以工作。

int main()
{
    int row = 10;
    int col = 10;

    int w=0;
    int k=0;

    int *tab = (int *)malloc(row*col*sizeof(int));

    if(tab == NULL)
    {
        printf("Failed to allocate memory");
        return 8;
    }

    int i=0;

    for (w=0; w<row; w++)
    {
        for(k=0; k<col; k++)
        {
            *(tab+w*col+k) = ++i;
        }
     }       

    for (w=0; w<row; w++){
            for(k=0; k<col; k++){
                printf("%3d ", *(tab+w*col+k) );
         }
         printf("\n");
        }   

    free(tab);

return 0;
}

【问题讨论】:

  • 为什么说“一次malloc、calloc、realloc的调用限制为80字节”呢?不允许您这样做真的是对作业/练习的限制吗?在这种情况下,有很多示例如何使用指向指针的指针(例如 int **tab 在您的情况下)制作“动态多维数组”。
  • 在普通系统上,malloc 等不应有一个小的限制(如 80 0r 400 字节),除非内存不足。当您尝试分配更多内存时究竟会发生什么?我建议将printf("Failed to allocate memory"); 替换为perror("malloc failed"); 或类似的,以显示相应的错误信息。请显示导致错误的值。你在什么系统上遇到问题?请edit您的问题添加缺失的信息。
  • 如果分配 80 个字节,那么您将无法容纳 100 个 4 字节元素。你需要更好地描述你的问题。请阅读How to Ask
  • 是的,我知道这很令人困惑。我会尝试更好地解释它。您可以在一次调用中使用 malloc、calloc 或 realloc 分配最多 80 个字节,但总体限制为 1000 个字节。您需要为多个 malloc、calloc 或 realloc 调用分配 480 个字节。
  • 然后使用realloc 5次?

标签: c malloc matrix-multiplication dynamic-memory-allocation


【解决方案1】:

嵌套的 mallocs() 是您需要使用的。但是,要小心,因为您还需要使用几个 frees()!


// 80 bytes
int** table = malloc(row * sizeof(int*));

for (int i = 0; i < row; i++) {
    // 80 bytes
    table[i] = malloc(col * sizeof(int));
}

// The 6th element in the first row is set to 5.
table[0][5] = 5;

【讨论】:

  • 可悲的是,在同一内存段上连续调用 realloc 10 次实际上比使用这段代码要快。只是不要发明毫无意义的、人为的分配方案。
  • @Lundin 这是一个非常标准的二维数组实现。这并不是毫无意义和人为的。
  • 无意义的方案是由 OP 发明的。至于这段代码,它甚至不是一个二维数组。见Correctly allocating multi-dimensional arrays
猜你喜欢
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 2017-07-16
  • 2020-05-02
  • 2020-12-06
  • 2020-05-05
  • 1970-01-01
  • 2017-03-02
相关资源
最近更新 更多