动态数组分配 returns 仅在所有索引中的最后一个元素 C

Dynamic array allocation returns only last element in all indices C

好的,我正在尝试将文本文件中的数据输入动态字符串数组。每个数据元组有 6 个属性。因此有 6 个数组。问题是当我填充所有数组时,它会循环打印正确的值。 但是当我尝试在循环外访问数组的任何元素时,它会给出文本文件的最后一个单词作为输出。我已经尝试了所有可用的解决方案,其中 none 似乎有效。

密码是:

int  n(FILE **fp, int size,  char **presenters, char **birth_numbers, char **room_codes, 
        char **authors, char **post_titles, char **presentation_types, char **presentation_times, 
        char **dates){
    // Buffer to get input from the file.
    char buffer[200];
    // To check if the file is open or not
    if (*fp == NULL){
        printf("File not Open");
    }
    else{
        char *file = "konferencny_zoznam.txt";
        fseek(*fp, 0, SEEK_SET);
        if (size >= 1){
            int length_of_arrays = sizeof presenters / sizeof *presenters;
            if (length_of_arrays > 1){
                printf("in null if");
                free(presenters);
                free(birth_numbers);
                free(room_codes);
                free(authors);
                free(post_titles);
                free(presentation_times);
                free(presentation_types);
                free(dates);
            }

            presenters = malloc((size+1)* sizeof(char*));
            birth_numbers = malloc((size+1)* sizeof(char*));
            room_codes = malloc((size+1)* sizeof(char*));
            authors = malloc((size+1)* sizeof(char*));
            post_titles = malloc((size+1)* sizeof(char*));
            presentation_times = malloc((size+1)* sizeof(char*));
            presentation_types = malloc((size+1)* sizeof(char*));
            dates = malloc((size+1)* sizeof(char*));

            const unsigned MAX_BUFFER_LENGTH = 256;
            char buffer[MAX_BUFFER_LENGTH];
            int i = 0, len = 0;
        

            while(fgets(buffer, MAX_BUFFER_LENGTH, *fp)){
                // len = strlen(buffer)+1;
                presenters[i] = buffer;
                fgets(buffer, MAX_BUFFER_LENGTH, *fp);
                birth_numbers[i] = buffer;
                fgets(buffer, MAX_BUFFER_LENGTH, *fp);
                room_codes[i] = buffer;
                fgets(buffer, MAX_BUFFER_LENGTH, *fp);
                authors[i] = buffer;
                fgets(buffer, MAX_BUFFER_LENGTH, *fp);
                post_titles[i] = buffer;
                fgets(buffer, MAX_BUFFER_LENGTH, *fp);
                presentation_times[i] = buffer;
                fgets(buffer, MAX_BUFFER_LENGTH, *fp);
                presentation_types[i] = buffer;
                fgets(buffer, MAX_BUFFER_LENGTH, *fp);
                dates[i] = buffer;
                printf("buffer : %s", dates[i]);
                fgets(buffer, MAX_BUFFER_LENGTH, *fp);

                i++;
            }
       
            for (int i=0; i<8; i++){
                
                printf("presenter[0]: %s", dates[i]);
                // Outputs 20200406 for each iteration which is the last word of file.

            }
        }
        else {
            printf("File not read already. Consider running command v before.");
        }
    }
}

对于初学者来说,在此声明中用作初始值设定项的表达式

int length_of_arrays = sizeof presenters / sizeof *presenters;

没有意义,因为它等同于

int length_of_arrays = sizeof( char ** ) / sizeof( char * );

在这个 while 循环中

        while(fgets(buffer, MAX_BUFFER_LENGTH, *fp)){
            // len = strlen(buffer)+1;
            presenters[i] = buffer;
            //..

所有元素dates[i]指向同一个数组

dates[i] = buffer;

所以这个循环

        for (int i=0; i<8; i++){
            
            printf("presenter[0]: %s", dates[i]);
            // Outputs 20200406 for each iteration which is the last word of file.

        }

输出最后存储在数组缓冲区中的内容。

看来您需要分配元素 dates[i] 指向的数组,并从缓冲区复制字符串。

而且功能很复杂。您应该将所有参数从第三个参数开始组合到一个结构中。

请注意,由于所有指针都是按值传递的,因此函数内内存的重新分配不会反映在用作参数的指针中。

你做不到

array[i] = buffer;

因为buffer是一个char数组,存放的是char数组的地址。当你将它的值赋给一个新变量时,你基本上是在将它的地址复制到一个新变量。这就是为什么数组的每个索引都指向保存文件中最新值的同一个数组。

您需要通过 strcpy 或其他方式复制缓冲区变量的内容来执行深复制。

所以我想通了。有两个问题。 1:Ehmad 提到,即我们需要在使用指针时使用 strcpy(),另一个是在循环的每一步,数组的每个索引都需要单独分配内存。