使用文件描述符读取文件时出现 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)
.另外,考虑到使用 strlen
、strcpy
等需要字符串包含 non-binary 数据,并且可能因不同的编码而失败,等等
另一种解决方案是将 config[i]
分配给返回的 c
字符串,然后在释放 config
时释放它。你会避免复制字符串。
我正在尝试使用文件描述符读取文件。文件描述符是正确的,所以,文件是正确打开的。程序读到最后一行时报错
这是代码:
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)
.另外,考虑到使用 strlen
、strcpy
等需要字符串包含 non-binary 数据,并且可能因不同的编码而失败,等等
另一种解决方案是将 config[i]
分配给返回的 c
字符串,然后在释放 config
时释放它。你会避免复制字符串。