【问题标题】:Multiplication Table issue乘法表问题
【发布时间】:2023-03-09 12:18:01
【问题描述】:

我正在尝试编写一个 C 函数来存储 0-x 范围内的乘法表。我写的函数有一个错误,它只存储表的前 2 或 3 行,而且函数也从不返回值,我很困惑,感谢任何帮助。

void makeTable (int x) {
int** table = malloc(x * sizeof(int*));
int i;
int q;
int* ptr;
for(i = 0; i <= x; i++){
    ptr = calloc(x, sizeof(int));
    for(q = 0; q <= x; q++){
        ptr[q] = (i * q);
    }
    table[i] = ptr;
}
return table;

}

【问题讨论】:

  • 如果你有一个大小为x的数组,最后一个可访问的元素由x-1索引
  • 你的函数被声明为void,当它想要返回一个int **时。编译器警告应该已经注意到了这一点。

标签: c malloc multiplication calloc


【解决方案1】:

在这里您可以访问尚未分配的内存。那是未定义的行为。

正确的做法是考虑 x 元素而不是 x+1

for(q = 0; q < x; q++){
        ptr[q] = (i * q);

外循环也一样。

for(i = 0; i < x; i++){

还有其他一些事情 - 从声明为 void 的函数返回(未定义的行为)。不检查malloccalloc 的返回值是有问题的。

所以编写函数的正确方法是

int** makeTable (int x) {
    int** table = malloc(x * sizeof *table);
    if(!table)
    {
        fprintf(stderr,"Error in mem alloc");
        exit(1);
    }
    for(size_t i = 0; i < x; i++){
        int * ptr = calloc(x, sizeof *ptr);
        if(!ptr)
        {
           fprintf(stderr,"Error in mem alloc");
           exit(1);
        }
        for(size_t q = 0; q < x; q++){
            ptr[q] = (i * q);
        }
        table[i] = ptr;
    }
    return table;
}

同样在这个程序的某个地方,您应该添加逻辑以使用free 释放所有这些动态分配的内存。

【讨论】:

    猜你喜欢
    • 2019-11-13
    • 2020-12-06
    • 1970-01-01
    • 2017-03-02
    • 1970-01-01
    • 2020-05-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多