C语言传递可变大小数组及子函数用malloc操作矩阵向量异常求解
问题诊断与修复方案
你的代码核心问题是指针传参类型不匹配,以及运算符优先级理解错误,具体问题和修复方法如下:
- 参数传递错误
LeeRed函数定义的形参类型为int*** mat和int** links,说明函数内部需要修改main函数中red(int**类型)、links(int*类型)本身的指向(比如用realloc扩容时修改指针地址),这种场景需要传递变量的地址,而不是解引用后的值。
你原代码的调用写法LeeRed(*red, *links, Nred, nombre, &colSize)传递的*red是int*类型、*links是int类型,和形参要求完全不匹配,会直接触发内存访问错误。正确调用写法应为:LeeRed(&red, &links, Nred, nombre, &colSize); - 运算符优先级错误
C语言中[]运算符优先级高于*,你在LeeRed中写的*links[i]=0会被解析为*(links[i]),属于非法越界访问。如果你要给links指向的数组第i位赋值为0,正确写法为:(*links)[i] = 0; - 额外优化建议
- 不需要强制转换malloc的返回值,C语言中
void*可以隐式转换为任意指针类型,强制转换反而会掩盖未引入stdlib.h头文件的编译错误 - 调用fopen打开文件后需要判断返回值是否为NULL,避免文件不存在/无权限时触发空指针访问崩溃
- 动态分配的内存使用完毕后需要调用free释放,避免出现内存泄漏
- 不需要强制转换malloc的返回值,C语言中
修复后最小可运行示例
#include <stdio.h> #include <stdlib.h> // 这里假设Nred是预先定义的常量,可根据你的需求调整数值 #define Nred 10 void LeeRed (int ***mat, int **links, int nNodes, char *nombre, int *colSize); int main() { char nombre[50]; sprintf(nombre,"data.txt"); int **red; int *links; int colSize; links = malloc(Nred*sizeof(int)); red = malloc(Nred*sizeof(int*)); for(int i=0; i<Nred; i++) { red[i] = malloc(1*sizeof(int)); } // 修正传参:传递指针的地址 LeeRed(&red, &links, Nred, nombre, &colSize); // 使用完毕后释放内存 for(int i=0; i<Nred; i++) { free(red[i]); } free(red); free(links); return 0; } void LeeRed (int ***mat, int **links, int nNodes, char *nombre, int *colSize) { int i, maxSize; FILE *f, *g; f = fopen(nombre,"rt"); if(f == NULL) { perror("打开输入文件失败"); return; } g = fopen("matrizPrueba.txt", "w"); if(g == NULL) { perror("打开输出文件失败"); fclose(f); return; } maxSize=0; /// 修正赋值写法,先解引用links再取下标 for(i=0; i<nNodes; i++) { (*links)[i] = 0; } // 后续业务逻辑 // ... fclose(f); fclose(g); }
内容的提问来源于stack exchange,提问作者Pablo Vizcaino
相关产品推荐
相关产品推荐

