使用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
相关产品推荐
相关产品推荐

