我正在尝试编写一个程序,读取未知长度的未知行数(使用malloc
)并将它们保存到结构中。
当我尝试打印我在结构中保存的内容时,出现了分段错误。
代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct line{
struct line* next_line;
char* data;
}line;
line* read_line(line* ptrLine, FILE* pFile);
int main(int argc, char *argv[])
{
if(argc < 2){
return 2;
}
FILE* pFile;
if((pFile = fopen(argv[1], "r")) == NULL){
return 1;
}
line* list_beginning = NULL;
line* curr_line;
curr_line = read_line(list_beginning, pFile);
while(1){
if(fgetc(pFile) == EOF) break;
fseek(pFile, -1, SEEK_CUR);
curr_line = read_line(curr_line, pFile);
}
//printf("%c", (list_beginning->data[0]));
/*while(curr_line->next_line != NULL){
unsigned int i = 0;
for(i = 0; i < strlen(curr_line->data); i++){
printf("%c", curr_line->data[i]);
}
}*/
fclose(pFile);
return 0;
}
line* read_line(line* ptrLine, FILE* pFile){
ptrLine = malloc(sizeof(line));
ptrLine->data = malloc(1024*sizeof(char));
int curr_position = 0;
char c;
while(1){
c = fgetc(pFile);
if(c == '\n' || c == EOF) {
*(ptrLine->data + curr_position) = '\0';
break;
}
*(ptrLine->data + curr_position) = c;
curr_position++;
}
ptrLine->next_line = NULL;
return ptrLine->next_line;
}
答案 0 :(得分:0)
line* read_line(line* ptrLine, FILE* pFile){
ptrLine = malloc(sizeof(line));
ptrLine->data = malloc(1024*sizeof(char));
int curr_position = 0;
char c;
while(1){
c = fgetc(pFile);
if(c == '\n' || c == EOF) {
*(ptrLine->data + curr_position) = '\0';
break;
}
*(ptrLine->data + curr_position) = c;
curr_position++;
}
ptrLine->next_line = NULL;
return ptrLine->next_line;
}
在这段代码中,最后两行不好:
ptrLine->next_line = NULL
return ptrLine->next_line;
你将next_line设置为NULL并返回它,这样你的“read_line”函数就会返回“NULL” 为了避免这种情况,请改变最后一行:
return ptrLine;
答案 1 :(得分:0)
查看您的read_line
功能。第一个参数是什么?我假设您要构建line
结构的链接列表,因此第一个参数是&#39; head&#39;链表。由于您正在调用函数,因此该参数的值位于堆栈中,但是您通过调用malloc
覆盖该值。
在功能结束时,您将next_line
字段设置为NULL
并返回该字段。这也是不正确的,这是你获得SegFault的主要原因。
最简单的解决方法是在此函数中创建一个新变量,比如new_line
,并在整个函数中使用它。然后,最后将next_line
字段设置为ptrLine
参数并返回new_line
。
我所描述的行动不仅仅是编写实际代码,而是让你思考要做什么。