无法让fscanf在简单程序中正确执行
我一直在51行上发现Seg故障fscanf(fp, "%d", lenPtr)
。每次运行该程序时,都会打印“1”,但在seg故障之前,它永远不会达到2。我做了很多次,似乎无法找出麻烦。我知道这是不正确的,但是当我将第51行替换为fscanf(fp,"%d", *lenPtr);
时,它不会导致分段错误。无法让fscanf在简单程序中正确执行
//Brendan Sullivan
//Section D
//Prelab 5
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef enum {
PENNY = 1,
NICKEL = 2,
DIME = 10,
QUARTER = 25,
} Denomination;
typedef struct {
Denomination denomination;
int quantity;
} Coin;
typedef Coin *PiggyBank;
PiggyBank loadBank(const char *filename, int *lenPtr);
int totalMoney(PiggyBank bank, int length);
int main(int argc, char *argv[]) {
int *length;
PiggyBank piggyBank = loadBank(argv[1], length);
/*for (i = 0; i < (*lenPtr); i++) {
printf("%d %d", piggyBank[i].denomination, piggyBank[i].quantity);
}*/
return 0;
}
PiggyBank loadBank(const char *filename, int *lenPtr) {
FILE *fp = fopen(filename, "r");
if (fp == NULL) {
printf("File could not be opened\n");
*lenPtr = 0;
return NULL;
}
printf("1\n");
fscanf(fp, "%d", lenPtr); //Line 51
printf("2\n");
printf("%d\n", *lenPtr);
PiggyBank piggyBank = malloc(sizeof(Coin) * (*lenPtr));
int i;
for (i = 0; i < *lenPtr; i++) {
fscanf(fp,"%u %d", &piggyBank[i].denomination, &piggyBank[i].quantity);
}
return piggyBank;
fclose(fp);
}
你叫loadBank
有未初始化的int* length
作为目标指针。未定义的行为随之而来。而应该这样:
int main(int argc, char *argv[]) {
int i, length;
PiggyBank piggyBank = loadBank(argv[1], &length);
for (i = 0; i < length; i++) {
printf("%d %d\n", piggyBank[i].denomination, piggyBank[i].quantity);
}
return 0;
}
注意,在loadBank
代码不分配任何东西,在函数中返回一个未定义的变量piggyBank
。您的代码无法编译,或者您没有正确发布它。
非常抱歉,我错过了一些代码,但我做了必要的修改。当我添加地址运算符并使用-Werror和-Wall编译时,我得到 “警告:从不兼容的指针类型传递loadBank的参数2”,然后尝试运行后出现分段错误。 –
您必须将'main'中的'length'改为'int length;'。你是否用文件名称的命令行参数调用程序? – chqrlie
可悲地改变'int *长度;'改为'int长度;'也没有帮助。我已经在许多程序中以类似的方式通过了'长度'功能,没有任何问题,我似乎无法弄清楚这一点。 –
请不要在行号后面输入代码。它的可读性较差,并且无法剪切和粘贴到编辑器进行测试和编译。 – chqrlie
'piggyBank; fclose(fp);' - 'fclose'永远不会被执行。在“返回”之前移动它。从'main'免费(piggyBank)'。 –