为什么使用calloc()却会得到垃圾值?

时间:2019-09-29 15:07:38

标签: c matrix dynamic-memory-allocation

我想知道为什么前两个元素总是非零。我不知道我能进一步描述这个问题,但是这不允许我发布问题,所以我正在写这个。不知道这是否行得通。

#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


3 个答案:

答案 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是否成功。否则,由于行为不确定,可能会导致难以发现的错误。

注意Do I cast the result of malloc?

答案 2 :(得分:2)

参考手册将calloc描述为:

void* calloc (size_t num, size_t size);

因此,calloc首先获取元素的num,然后再获取特定元素的size

尝试:

matrix = (int **) calloc(SIZE, sizeof(int *));