使用函数与calloc读取文件时colAlloc函数调用崩溃问题求助
我来帮你拆解代码里导致崩溃的几个关键问题,核心确实是对指针传递和多级指针的理解出现了混淆:
1. 多级指针解引用错误(直接触发崩溃)
在colAlloc函数里,你写了c = &s;——这里s是int**类型的参数,而c是int类型,直接把指针地址赋值给整数变量,完全不符合逻辑。你真正需要的是取出s指向的整数值,应该写成:
c = **s;
2. 函数调用时的参数传递错误
在readSpaces里调用colAlloc时,你传入了&r,但r本身已经是int*类型(指向行数的指针),&r就变成了int**。而在colAlloc里你用*r去和i比较,此时*r是int*类型,和int类型的i做比较会导致类型不匹配,甚至读取非法内存。
如果你的colAlloc不需要修改行数r的数值,只是要读取它的大小,那应该把colAlloc的int** r参数改成int* r,调用时直接传r即可;如果确实需要修改r,那在colAlloc里访问行数应该用**r,但看你的代码逻辑不需要修改行数,所以调整参数类型更合理。
3. 不必要的内存释放(导致后续悬空指针)
colAlloc函数的目的是给矩阵分配列内存,但你在分配完成后立刻调用free(m[i])把刚分配的内存释放了,这会导致后续操作m时出现悬空指针,完全违背了分配内存的初衷,这部分代码应该删掉。
4. 文件指针位置问题(潜在隐患)
在readSpaces里,你先通过getc遍历了整个文件统计空格数,此时文件指针已经到了EOF位置。如果后续还要读取文件内容,需要用fseek(ptrF, 0, SEEK_SET)把指针重置到文件开头,或者重新打开文件,否则后续读取会直接得到EOF。
另外还有个容易忽略的点:之前的代码没有检查fopen的返回值,如果文件打开失败,ptrF会是NULL,后续调用getc会直接导致崩溃,必须加上错误检查。
修正后的完整代码示例
#include <stdio.h> #include <stdlib.h> void colAlloc(FILE *ptrF, char fileN[], double **m, int *r, int *s) { int i; int c = *s; // 直接解引用拿到列数,s是int*类型 for (i = 0; i < *r; i++) { m[i] = (double *)calloc(c, sizeof(double)); if (m[i] == NULL) { printf("\nSorry, not enough memory!\n\n"); exit(0); } } printf("Cols >> %d.\n\n", c); // 删除不必要的free操作 } void readSpaces(FILE *ptrF, char fileN[], double **m, int *r) { ptrF = fopen(fileN, "r"); // 新增文件打开失败的检查 if (ptrF == NULL) { printf("Failed to open file: %s!\n", fileN); exit(0); } char s; int ctrS = 0; int cVal; // 修正重复的'\t'判断 for (s = getc(ptrF); s != EOF; s = getc(ptrF)) { if (s == ' ' || s == '\t') { ++ctrS; } } cVal = ctrS / *r; // 重置文件指针到开头,方便后续读取 fseek(ptrF, 0, SEEK_SET); // 修正参数传递,直接传r和&cVal colAlloc(ptrF, fileN, m, r, &cVal); fclose(ptrF); }
内容的提问来源于stack exchange,提问作者Hadrian Hu

