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

问题描述 投票:3回答:3

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

#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


c matrix dynamic-memory-allocation
3个回答
3
投票

您没有分配足够的内存:

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>,这可能会掩盖错误。>


2
投票

代码使用calloc(sizeof(int), SIZE),但是结构中的实际数据类型为int *,从而导致在某些系统上内存分配不足(我的int大小为4,int *大小为8)。


1
投票

参考手册将malloc描述为:

© www.soinside.com 2019 - 2024. All rights reserved.