使用文件描述符读取文件时出现 SIGSEGV

SIGSEGV while reading file using file descriptor

我正在尝试使用文件描述符读取文件。文件描述符是正确的,所以,文件是正确打开的。程序读到最后一行时报错

这是代码:

void readFile(char* filePath){
int fd,i=0;
char *c= NULL;
int read=1;
fd = open(filePath, O_RDONLY );
char **config;
config=(char**)malloc(4 * sizeof(char*));

if(fd<0){
    printf("Error");
} else {
    while (read==1){
        c=readLine(fd);

        if(*c=='[=10=]'){
            read=0;
        }else{
            config[i]=(char*) malloc(sizeof(char));
            strcpy(config[i], c);
            i++;
        }
    }
    close(fd);
}

}

char *readLine(int fd){
 char character;
 char *array= malloc(1);
 unsigned int siz=1;


 while (read(fd, &character, 1) > 0 && character!='\n'){
     array=realloc(array, siz + 1);
     array[siz - 1]=character;
     siz ++;
 }
 array[siz - 1]='[=10=]';
 return array;

该程序有几个缺陷,包括没有释放动态分配的内存(例如 readline 返回的内存)。

但是,阻止程序 运行 的至少是缺少每个 config[i] 位置的 space。您只需为一个字符 malloc(sizeof(char)) 保留 space,但您必须为随后复制的整个字符串保留 space,加上结尾 '[=13=]'malloc(strlen(c) + 1) .另外,考虑到使用 strlenstrcpy 等需要字符串包含 non-binary 数据,并且可能因不同的编码而失败,等等

另一种解决方案是将 config[i] 分配给返回的 c 字符串,然后在释放 config 时释放它。你会避免复制字符串。