我正在编写一个简单的c程序,它将文本文件中的行读入char**。在主函数中,我创建char*数组,为它分配内存,并将指向该数组的指针传递给另一个函数,用一个char*填充数组中的每个索引,char*表示文本文件中每一行的内容。
出于与我的内存管理相关的原因,我猜,我在while循环的第三次迭代中收到了一个分段错误,它将字符串复制到字符串数组中。这是为什么?
我的代码:

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

void getRestaurants(char ***restaurantsArray) {
    FILE *restaurantsFile = fopen("./restaurants.txt", "r");
    char *restaurant = (char *)malloc(50 * sizeof(char));
    char *restaurantCopy = restaurant;

    //fopen will return null if it is unable to read the file
    if (restaurantsFile == NULL) {
    free(restaurant);
    return;
    }

    int index = 0;
    while (fgets(restaurantCopy, 50, restaurantsFile)) {
        // segfault occurs the third time the following line is executed
        *restaurantsArray[index] = (char*)malloc(50 * sizeof(char));
        strcpy(*restaurantsArray[index], restaurantCopy);
        printf("%s", restaurantCopy);
        printf("%s", *restaurantsArray[index]);
        index++;
    }

    fclose(restaurantsFile);
    free(restaurant);
}

void main() {
    char **restaurantsArray = (char **)malloc(100 * sizeof(char *));
    char **restaurantsArrayCopy = restaurantsArray;
    getRestaurants(&restaurantsArrayCopy);
}

预期结果:
firstline
firstline
secondline
secondline
thirdline
thirdline

等等,如果提供的restaurants.txt文件包含:
firstline
secondline
thirdline

最佳答案

getRestaurants中,restaurantsArray声明为char ***Array。在*restaurantsArray[index] = …;行中,它接受restaurantsArray[index]并尝试将其用作指针(通过应用*运算符)。但是restaurantsArray只是指向restaurantsArrayCopymain的指针。restaurantsArrayCopy只是单个对象,而不是数组。它只是一个char **。在getRestaurants中,对restaurantsArray[index]使用index和除零以外的任何值都会使用一些未定义的值。
无需将&restaurantsArrayCopymain传递到getRestaurants。只要通过restaurantsArray。这是指向已分配空间的指针。
然后,在getRestaurants中,不使用*restaurantsArray[index] = …;,而使用restaurantsArray[index] = …;。这将为*中的元素分配一个值,这是您要做的。同样,删除restaurantsArray中的*strcpy

08-06 00:37