2016-02-28 24 views
-1

我一直在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)'。 –

回答

1

你叫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長度;'也沒有幫助。我已經在許多程序中以類似的方式通過了'長度'功能,沒有任何問題,我似乎無法弄清楚這一點。 –