无法让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); 
} 
+1

请不要在行号后面输入代码。它的可读性较差,并且无法剪切和粘贴到编辑器进行测试和编译。 – chqrlie

+0

'piggyBank; fclose(fp);' - 'fclose'永远不会被执行。在“返回”之前移动它。从'main'免费(piggyBank)'。 –

你叫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。您的代码无法编译,或者您没有正确发布它。

+0

非常抱歉,我错过了一些代码,但我做了必要的修改。当我添加地址运算符并使用-Werror和-Wall编译时,我得到 “警告:从不兼容的指针类型传递loadBank的参数2”,然后尝试运行后出现分段错误。 –

+0

您必须将'main'中的'length'改为'int length;'。你是否用文件名称的命令行参数调用程序? – chqrlie

+0

可悲地改变'int *长度;'改为'int长度;'也没有帮助。我已经在许多程序中以类似的方式通过了'长度'功能,没有任何问题,我似乎无法弄清楚这一点。 –