通过动态添加一些结构元素来创建结构数组

时间:2019-05-29 21:10:09

标签: c arrays memory-management dynamic struct

我已经为C指针苦苦挣扎了几个小时。我正在尝试创建一个管理航班的C程序。排期包含以下内容:

flight-number, from, to, date, price

OS772,Vienna,New York,15.12.2018,638.00

因此,我正在读取此给定结构的文本文件。在读取的每一行中,我需要创建另一个结构,并将其添加到我的结构数组或“列表”中。

结构如下:

typedef struct flights {
    char *flnum;
    char *from;
    char *to;
    char *date;
    float price;
    struct person *fPerson;
}flights;

我的问题:在函数内部,正确创建了结构数组。但是回到主函数后,指向名为“ flights ** flight_list”的数组的指针仍然为NULL。

这是代码(只有必要的部分):

int main(void) {

    flights **flight_list = NULL;
    int numFlights = 0;

    if (!(numFlights = load_flights(flight_list)))      
        return EXIT_FAILURE;

    /* value of flight_list = 0x0000 -> unchanged! */
    /* ... */

功能short load_flights(flights **flight_list)

short load_flights(flights **flight_list) {

    FILE *fp = NULL;
    char file_buffer[256] = {};
    int i = 0;

    if (fp = fopen("flights.txt", "r")) {

        /* create array of structs */
        flight_list = (flights **)calloc(1, sizeof(int));

        while (!feof(fp)) {

            /* read current line of flight from textfile */
            fgets(file_buffer, sizeof(file_buffer), fp);

            /* create a new struct and add it to the array */
            if ((flight_list[i] = (flights *)calloc(1, sizeof(flights))) != NULL) {

                /* create every variable of the struct */
                flight_list[i]->flnum = (char *)calloc(1, strlen(ptr)+1);

                /* ... */

            }

            i++;
        }
    }
    else return 0;

    /* values of the struct-array are properly set; look in attached picture */

    return i;
}

这张图片是在return i;之前调试数组创建过程时拍摄的:

viewing array of struct

在函数之外;内部main:

viewing array of structs in main

那么,为什么我的结构体数组进入了主功能?

1 个答案:

答案 0 :(得分:0)

您需要将指针变量的地址传递给load_flights。然后load_flights需要间接访问该变量以修改调用方的变量。

要处理输入的动态大小,您需要在循环中每次使用realloc()来增长数组。

int main(void) {

    flights **flight_list = NULL;
    int numFlights = 0;

    if (!(numFlights = load_flights(&flight_list)))      
        return EXIT_FAILURE;

    /* ... */
}

short load_flights(flights ***flight_list) {

    FILE *fp = NULL;
    char file_buffer[256] = {};
    int i = 0;

    if (fp = fopen("flights.txt", "r")) {

        /* create array of structs */
        flight_list **temp_flight_list = NULL;

        /* read current line of flight from textfile */
        while (fgets(file_buffer, sizeof(file_buffer), fp)) {
            // Grow the flight list array
            flights **new_flight_list = realloc(*flight_list, (i+1) * sizeof(flight_list *));
            if (new_flight_list == NULL) { // allocation failed, throw everything away
                for (int j = 0; j < i-1; j++) {
                    free(temp_flight_list[i]->flnum);
                    free(temp_flight_list[i]->from);
                    /* ... */
                    free(temp_flight_list[i]);
                }
                free(temp_flight_list);
                return 0;
            }
            temp_flight_list = new_flight_list;
            /* create a new struct and add it to the array */
            if ((temp_flight_list[i] = calloc(1, sizeof(flights))) != NULL) {
                // Parse the buffer ...
                /* create every variable of the struct */
                temp_flight_list[i]->flnum = calloc(1, strlen(ptr)+1);

                /* ... */

            } else { // allocation failed, throw everything away
                for (int j = 0; j < i-1; j++) {
                    free(temp_flight_list[i]->flnum);
                    free(temp_flight_list[i]->from);
                    /* ... */
                    free(temp_flight_list[i]);
                }
                free(temp_flight_list);
                return 0;
            }
            i++;
        }
        // Store new flight list in caller's variable
        *flight_list = temp_flight_list;
        return i;
    }
    else return 0;

}

另请参见

Do I cast the result of malloc?

Why is “while (!feof(file))” always wrong?