【发布时间】:2020-12-06 08:58:02
【问题描述】:
函数int load(const char *filename, int ***ptr, enum save_format_t format) 应该从二进制或文本文件(名称保存在filename 指针下)加载数据到ptr 指向矩阵的指针下的矩阵。文件扩展名取决于变量格式的值:0 或 1(在我展示的函数中,只有 format=0 的选项,主要用于文本文件,因为只有这个会造成麻烦)。文件中的正确数据如下所示:
10 20 30 40 50 60 70 -1
100 200 300 400 500 600 700 800 -1
对于与上述示例完全相同的数据,应按如下方式加载数据:
int A[] = {10, 20, 30, 40, 50, 60, 70, -1};
int B[] = {100, 200, 300, 400, 500, 600, 700, 800, -1};
int D[] = {A, B, C, NULL};
这意味着每一行都必须以'-1'结尾,(数据必须以'-1'加载到矩阵中)。指向最后一行之后的行的指针应该等于 NULL。
如果任何部分关闭函数分配失败,函数应该返回 4。
对扩展名为“.bin”且具有堆限制的文件执行的测试返回此错误:
函数应该返回 4,但它返回了 0。
我使用诸如 **ptr 之类的符号,因为我不允许使用方括号。
谁能帮助我如何让我的函数返回正确的整数。我的功能如下:
int load(const char *filename, int ***ptr, enum save_format_t format) {
if (filename == NULL || ptr == NULL || format != 0 && format != 1) {
return 1;
}
int val = 0;
int **temp = NULL;
FILE *fp, *pp;
if (format == 0) {
int i = 0, x = 0, h = 0, w = 0;
fp = fopen(filename, "r");
if (fp == NULL) {
return 2;
}
pp = fopen(filename, "r");
if (pp == NULL) {
fclose(fp);
return 2;
}
int val2 = 0;
while (1) {
if (fscanf(fp, "%d", &val2) != 1) {
if (i == 0 || val != -1) {
fclose(fp);
fclose(pp);
return 3;
}
break;
}
val = val2;
if (val == -1) {
h++;
}
i++;
}
if (i == h) {
fclose(fp);
fclose(pp);
return 3;
}
i = 0;
fseek(fp, 0, SEEK_SET);
temp = malloc(sizeof(temp) * (h + 1));
if (temp == NULL) {
fclose(fp);
fclose(pp);
return 4;
}
*(temp + h) = NULL;
for (i = 0; i < h; i++) {
val = 0, w = 0;
while (val != -1) {
if (fscanf(pp, "%d", &val) == EOF) {
break;
}
w++;
}
if (*(temp + i) != NULL) {
*(temp + i) = (int *)malloc(sizeof(int) * w);
if (*(temp + i) == NULL) {
for (int s = 0; s < i; s++) {
free(*(temp + s));
}
free(temp);
fclose(pp);
fclose(fp);
return 4;
}
} else {
fclose(fp);
fclose(pp);
free(temp);
return 0;
}
for (x = 0; x < w; x++) {
fscanf(fp, "%d", *(temp + i) + x);
}
}
fclose(fp);
fclose(pp);
}
*ptr = temp;
return 0;
}
【问题讨论】:
-
代码中发生了什么?
temp有什么意义?h?s?也许使用更具描述性的变量名称?也许添加一些cmets?为什么没有realloc?为什么要打开同一个文件两次?对于繁琐的错误处理,您可能只想将其重构为多个函数或使用 goto 错误管理。当if (*(temp + i) != NULL) {为真时,您返回0,我认为*ptr未设置。 -
这一行
if (*(temp + i) != NULL) {肯定是错误的。temp + i指向的内存未初始化,因此读取它并测试它是否为 NULL 是没有意义的。 -
int D[] = {A, B, C, NULL};这是从哪里来的?示例文件没有这样的内容 -
我会尽力纠正我的错误并迅速正确地描述一切
-
temp = malloc(sizeof(temp) * (h + 1));不正确:应该是temp = malloc(sizeof(*temp) * (h + 1));
标签: c memory multidimensional-array malloc dynamic-memory-allocation