我想知道为什么前两个元素总是非零。我不知道我能进一步描述这个问题,但是这不允许我发布问题,所以我正在写这个。不知道这是否行得通。
#include <stdio.h>
#include <stdlib.h>
#define SIZE 3
void printMatrix(int **m)
{
for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE; j++)
printf("%d ", m[i][j]);
printf("\n");
}
}
int main(int argc, char const *argv[])
{
int **matrix;
matrix = (int **) calloc(sizeof(int), SIZE);
for (int i = 0; i < SIZE; ++i)
matrix[i] = (int *) calloc(sizeof(int), SIZE);
printf("%s\n", "Matrix initialized.");
printMatrix(matrix);
return 0;
}
输出:
1371548192 32653 0
0 0 0
0 0 0
答案 0 :(得分:4)
您没有分配足够的内存:
matrix = (int **) calloc(sizeof(int), SIZE);
在这里,您尝试创建一个3 int *
的数组,但是您只为3 int
分配了空间。如果系统上的指针大于int
的指针(很可能是),则在为每一行创建数组时,都将写到数组末尾。在分配的内存末尾写入将调用undefined behavior。
由于要创建int *
的数组,因此请使用该数组作为每个元素的大小:
matrix = calloc(sizeof(int *), SIZE);
此外,请勿强制转换malloc
/ realloc
/ calloc
的返回值,因为如果您忘记了#include <stdlib.h>
答案 1 :(得分:3)
代码使用calloc(sizeof(int), SIZE)
,但结构中的实际数据类型为int *
,导致某些系统上的内存分配不足(我将int
的大小设置为4,而{{1} }大小为8)。
这是一个重写建议(我们将在int *
调用中按其标题交换大小参数):
calloc
在这里,我们分别使用int main(int argc, char const *argv[]) {
int **matrix;
if (!(matrix = calloc(SIZE, sizeof(*matrix)))) {
fprintf(stderr, "calloc failed");
return 1;
}
for (int i = 0; i < SIZE; ++i) {
if (!(matrix[i] = calloc(SIZE, sizeof(*(matrix[i]))))) {
fprintf(stderr, "calloc failed");
return 1;
}
}
printf("%s\n", "Matrix initialized.");
printMatrix(matrix);
return 0;
}
和*matrix
类型的*matrix[i]
和int *
来代替hard coding。如果需要在某些时候进行类型调整,这可以帮助我们避免错误和寻找更改代码的位置。
我们还通过测试指针是否为非NULL来检查int
是否成功。否则,由于行为不确定,可能会导致难以发现的错误。
答案 2 :(得分:2)
参考手册将calloc
描述为:
void* calloc (size_t num, size_t size);
因此,calloc
首先获取元素的num
,然后再获取特定元素的size
尝试:
matrix = (int **) calloc(SIZE, sizeof(int *));