C语言矩阵函数实现求助:create函数代码异常排查及修正
排查与修正矩阵创建函数的问题
嘿,我帮你梳理下这个create函数里的几个关键问题,正是这些问题导致它没法正常运行:
1. 第一层内存分配的类型错误
你在给*p分配内存时,用了sizeof(int),但实际上*p是int**类型,我们需要分配的是n个指向int数组的指针(即int*类型),而不是int类型的空间。在64位系统里,指针大小通常是8字节,int是4字节,这样分配的空间会不足,后续操作很容易触发越界错误。
修正方式:把sizeof(int)改成sizeof(int*)。
2. 循环中行指针的访问逻辑错误
循环里的*(p[i])完全搞错了访问路径!p是int***类型,p[i]表示的是从p这个指针的位置往后偏移i个int**大小的地址,这根本不是我们刚分配的二维数组的行指针。正确的做法是先通过*p拿到我们分配的二维数组首地址(int**类型),再访问它的第i个元素,也就是(*p)[i]。
3. 内存泄漏隐患(可选但重要)
如果某一行的calloc失败了,之前已经分配的内存没有被释放,会造成内存泄漏。所以在报错时需要先清理已分配的资源。
修正后的完整代码
#include <stdio.h> #include <stdlib.h> void create(int*** p, const int n) { // 分配第一层:n个int*指针的空间 *p = (int**)calloc(n, sizeof(int*)); if (*p == NULL) { printf("Error1: Failed to allocate row pointers\n"); return; } int i; for (i = 0; i < n; i++) { // 分配第i行的n个int空间 (*p)[i] = (int*)calloc(n, sizeof(int)); if ((*p)[i] == NULL) { printf("Error2: Failed to allocate row %d\n", i); // 释放已分配的行和第一层指针 for (int j = 0; j < i; j++) { free((*p)[j]); } free(*p); *p = NULL; // 避免外部使用野指针 return; } } }
这样修改后,函数就能正确创建n×n的二维矩阵了,还处理了内存分配失败时的资源清理问题,避免泄漏。
内容的提问来源于stack exchange,提问作者Rasuljon
相关产品推荐
相关产品推荐

