使用文件描述符读取文件时,SIGSEGV

时间:2019-07-15 17:59:13

标签: c segmentation-fault 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=='\0'){
            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]='\0';
 return array;

1 个答案:

答案 0 :(得分:2)

程序有一些缺陷,包括不释放动态分配的内存(例如,由readline返回的内存)。

但是,阻止该程序至少运行的原因是每个config[i]位置都缺少空间。您只需要为一个字符malloc(sizeof(char))保留空间,但是就必须为复制后的整个字符串以及末尾的'\0'malloc(strlen(c) + 1)保留空间。另外,请考虑使用strlenstrcpy等,期望该字符串包含非二进制数据,并且使用不同的编码等可能会失败。

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