You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用calloc()仍出现垃圾值?为何前两个元素始终非零

问题分析与修复:calloc初始化二维数组出现前两个元素垃圾值

你这明显是踩了calloc参数顺序的坑!咱们直接说问题:

核心错误

calloc的函数原型是:void *calloc(size_t num_elements, size_t element_size),第一个参数是要分配的元素数量,第二个是单个元素的字节大小。

你初始化二维数组的第一层指针时写反了参数:

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

这里你把「单个元素的大小」当成了第一个参数,「元素数量」当成了第二个参数。而matrix是int**类型,需要分配SIZE个int*类型的指针空间,正确的写法应该是:

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

原来的错误写法会导致分配的内存空间大小不对,matrix数组里的前几个指针指向的是非法内存区域,所以访问m[0][0]和m[0][1]时就会读到随机垃圾值,而后面的元素刚好侥幸落在了正确初始化的区域里,才显示为0。

修正后的完整代码

#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;
    // 修正calloc的参数顺序,分配SIZE个int*指针
    matrix = (int **) calloc(SIZE, sizeof(int*));
    for (int i = 0; i < SIZE; ++i)
        matrix[i] = (int *) calloc(SIZE, sizeof(int));
    printf("%s\n", "Matrix initialized.");
    printMatrix(matrix);
    
    // 记得释放内存,避免泄漏
    for (int i = 0; i < SIZE; ++i)
        free(matrix[i]);
    free(matrix);
    
    return 0;
}

我还加了内存释放的代码,养成好习惯避免内存泄漏~

运行结果

修正后运行会输出全0的矩阵:

Matrix initialized.
0 0 0 
0 0 0 
0 0 0

内容的提问来源于stack exchange,提问作者Nikhil CSB

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:02:02