C中的Malloc结构打印错误

时间:2015-08-01 20:22:13

标签: c printing struct linked-list infinite-loop

我试图编写一个将.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;

}

这是我从它得到的输出(似乎无限循环)。

1 个答案:

答案 0 :(得分:1)

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);
    }