我想知道为什么前两个元素总是非零。我不知道我能进一步描述这个问题,但是这不允许我发布问题,所以我正在写这个。不知道这是否行得通。
#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
您没有分配足够的内存:
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>
,这可能会掩盖错误。>
代码使用calloc(sizeof(int), SIZE)
,但是结构中的实际数据类型为int *
,从而导致在某些系统上内存分配不足(我的int
大小为4,int *
大小为8)。
参考手册将malloc
描述为: