在char指针数组中进行malloc分配时接收segfault

时间:2019-07-20 00:12:43

标签: c arrays pointers segmentation-fault

我正在编写一个简单的c程序,该程序将文本文件中的行读取为char **。在我的主函数中,我创建char *数组,为其分配内存,然后将指向该数组的指针传递给另一个函数,以用char *代表该文本文件中每一行的内容填充该数组中的每个索引。 / p>

由于某种原因,我猜测与内存管理有关,我在while循环的第三次迭代中收到分段错误,该错误将字符串复制到字符串数组中。为什么会这样?

我的代码:

import pandas as pd
import sys

class CaptureErrors:
    def __init__(self, stderr, output_name):
        self.stderr = stderr
        self.output_name = output_name
        self.output_file = None

    def __enter__(self):
        self.output_file = open(self.output_name, "w")
        return self

    def __exit__(self, exc_type, exc_value, traceback):
        if self.output_file:
            self.output_file.close()
        sys.stderr = self.stderr

    def write(self, message):
        self.stderr.write(message)
        self.output_file.write(message)

def main():
    filename = "test_data3.csv"
    with CaptureErrors(sys.stderr, 'error.txt') as sys.stderr:
        data = pd.read_csv(filename, error_bad_lines=False)
    print(data.head())

if __name__=="__main__":
    main()

预期结果:

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

,依此类推,如果提供的restaurant.txt文件包含:

firstline
firstline
secondline
secondline
thirdline
thirdline

1 个答案:

答案 0 :(得分:2)

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中的printf