如何在没有 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]..."
sizeofvstup1
和sizeofvstup2
是数组长度的变量。
我应该如何在这里使用 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;
没有 任何 修改。
我正在做一个学校项目,试图创建一个基于变量的二维数组。
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]..."
sizeofvstup1
和sizeofvstup2
是数组长度的变量。
我应该如何在这里使用 calloc
?尝试了很多次来稍微改变一下线路但没有帮助......:/
代码应该是什么样子才能正常工作?
您没有为第一次分配分配适当的大小:
wagner =(int **)calloc((sizeofvstup1+1),sizeof(int));
在这里,您为指针数组分配了 space,但为元素大小传递了 sizeof(int)
。如果 int
小于 int *
,那么你没有足够的 space,你最终 reading/writing 超出了数组的末尾。
将分配的元素大小更改为sizeof(int *)
。另外,不要转换 calloc
:
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;
没有 任何 修改。