簡體   English   中英

C中的Malloc結構打印錯誤

[英]Malloc struct printing error in C

我正在嘗試編寫一個程序,該程序將.bin文件讀入動態分配的結構中。 直到我需要打印結果為止,它似乎一直在做我想要的事情。 我一次又一次遇到相同結構的無盡循環,而不是每個結構一次。 代碼如下:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>

main(){
    //File pointer
    FILE *binFile = NULL;

    //Struct declaration
    typedef struct flightData_struct {
        char flightNum[7];
        char origCode[5];
        char destCode[5];
        int timeStamp;
        struct flightData_struct* next;
    } flightData;
    flightData myFlightData;
    struct flightData_struct *head;
    struct flightData_struct *tail;

    //Opening file
    printf("Opening file...\n");

    binFile = fopen("acars.bin", "rb");
    if (binFile == NULL){
        printf("ERROR: Could not open file. Please try again.");
        return -1;
    }

    //Malloc'ing first struct
    struct myflightData *point = (struct myFlightData*) malloc(sizeof(flightData));
    fread(point, sizeof(flightData), 1, binFile);

    head = point;
    tail = point;

    //Malloc'ing structs
    while (!feof(binFile)){
        flightData *temp = (struct flightData*) malloc(sizeof(flightData));
        fread(temp, sizeof(flightData), 1, binFile);
        temp->next = NULL;
        tail->next = temp;
        tail = tail->next;
    }

    tail = head;

    while (tail != 0){
        int t;
        t = tail->timeStamp;
        time_t time = t;
        printf("%s| %s| %s| %s\n\n", tail->flightNum, tail->origCode, tail->destCode, asctime(gmtime(&time)));
    }

    //Closing file
    printf("Closing file...");
    fclose(binFile);
    return 0;

}

這是我從中得到的輸出(它似乎無限循環)。

while (tail != 0)循環中,您永遠不會更新tail ,因此循環條件不會改變。 您需要將tail移至列表下方。 將其添加到循環的末尾:

tail = tail->next;

這樣您就可以遍歷列表。

編輯:

在這種情況下,您會丟失對列表尾部的引用,這會使其他人混淆您的代碼。 相反,您應該定義一個單獨的變量,例如flightData temp ,將其初始化為head ,然后在循環中使用它而不是tail

其他一些問題:

切勿在C中malloc的返回值,因為這樣做會掩蓋其他問題,例如不包括stdlib.h 由於malloc返回void * ,因此可以將其分配給任何類型的指針,而無需強制轉換。 注意,這與C ++不同,后者需要這樣的轉換。

然后是這個:

struct myflightData *point = malloc(sizeof(flightData));

沒有定義struct myflightData 您可能要改用flightData

您也無法檢查fread的返回值。 您應該這樣做:

    len = fread(temp, sizeof(flightData), 1, binFile);
    if (len == -1) {
        perror("fread failed");
        exit(1);
    } else if (len != 1) {
        fprintf(stderr,"read %d, expected %d\n", len, 1);
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM