如何在没有 valgrind 错误的情况下调用二维数组?

How to calloc a 2D array without valgrind errors?

我正在做一个学校项目,试图创建一个基于变量的二维数组。

int **wagner;
wagner = (int **)calloc((sizeofvstup1 + 1), sizeof(int));
for (int i = 0; i < (sizeofvstup1 + 1); i++) {
    wagner[i] =(int *)calloc((sizeofvstup2 + 1), sizeof(int));
}

我使用 calloc 在每个数组位置上得到 0。但是 valgrind 一直告诉我这样的事情:

Invalid write of size 8 at the "wagner[i]..."

sizeofvstup1sizeofvstup2是数组长度的变量。 我应该如何在这里使用 calloc ?尝试了很多次来稍微改变一下线路但没有帮助......:/

代码应该是什么样子才能正常工作?

您没有为第一次分配分配适当的大小:

wagner =(int **)calloc((sizeofvstup1+1),sizeof(int));

在这里,您为指针数组分配了 space,但为元素大小传递了 sizeof(int)。如果 int 小于 int *,那么你没有足够的 space,你最终 reading/writing 超出了数组的末尾。

将分配的元素大小更改为sizeof(int *)。另外,不要转换 calloc:

的 return 值
wagner = calloc((sizeofvstup1 + 1), sizeof(int *));

正如其他人提到的,代码在第一次分配时使用了错误的大小。

分配时再也不用考虑使用哪个大小有一个简单的技巧:

鉴于内存分配的结果总是分配给一个指针,只需简单地请求分配(倍数)这个目标指针指向的大小,方法是:

int **wagner;
wagner = calloc(sizeofvstup1 + 1, sizeof *wagner);
for (size_t = 0; i < (sizeofvstup1 + 1); ++i) {
    wagner[i] = calloc(sizeofvstup2 + 1, sizeof *wagner[i]);
}

(代码的所有其他更改与此无关"trick")

这样代码甚至可以在

int ** wagner;

假设

double ** wagner;

没有 任何 修改。