尝试将二进制文件中存储的数据打印到动态数组中时出现段错误
Seg fault while trying to print data stored from binary file into dynamic array
我有一个二进制文件,我可以将其视为其中包含以这种方式存储的单词的文本:entry one entry two entry three(因此单独的条目是连续的,但单个条目可以包含两个由 [=32= 分隔的单词])
我有这个代码:
char **data;
int start = 0;
data = malloc(all_names * sizeof(char*));
fd=open(argv[1],O_RDWR|O_CREAT,S_IRWXU);
for(i=0; i<all_names; i++){
data[i] = malloc((MAX_SIZE+1)*sizeof(char));
int end = atoi(positions[i]);
read(fd,&data[i],(end-start));
start = end;
}
for(i=0; i<all_names; i++){
printf("%s\n", data[i]);
}
Positions 数组包含除第一个字符串之外的每个字符串的开始位置。
例如。如果 positions[0] = 9,这意味着第一个条目有 9 个字符,第二个条目的第一个字符是字节数 9.
我得到一个分段错误,似乎是在尝试打印数组后立即发生的,但我无法弄清楚它是由于错误打印还是首先没有正确存储单词引起的。
现在,我在创建 pos 数组时遇到了问题并问了一个类似的问题 。在解决这个问题之后,这不起作用,我尝试了这个看起来更像是我对另一个问题的答案的版本:
fd=open(argv[1],O_RDWR|O_CREAT,S_IRWXU);
for(i=0; i<all_names; i++){
positions[i] =malloc((MAX_SIZE+1)*sizeof(char));
int end = atoi(positions[i]);
for(j=0;j<(end-start) ;j++){
read(fd,&data[i][j],1);
}
data[i][j]=0;
printf("%s\n",data[i]);
}
和打印时相同的代码,在同一点出现相同的段错误。
我尝试逐字符打印:
start = 0;
for(i=0; i<all_names; i++){
int end = atoi(positions[i]);
for(j=0;j<(end-start) ;j++){
printf("%c",data[i][j]);
}
printf("\n");
}
还是一样的问题。感谢您的帮助,如果您觉得有必要投反对票,请解释原因,以便我改进。如果需要更多信息,我会提供。
问题可能是您在读取文件时使用 &data[i]
得到的未定义行为。由于 data[i]
是指向某些数据的指针,因此 &data[i]
是指向该指针的指针,并且类型为 char **
.
删除 address-of 运算符并仅使用 data[i]
.
如 "Some programmer dude" 的回答所述,从 &data[i]
中删除 & 将消除段错误。我看到了您的评论,我认为您只是没有组合代码的正确部分。
data = malloc(all_names * sizeof(char*));
fd=open(argv[1],O_RDWR|O_CREAT,S_IRWXU);
for(i=0; i<all_names; i++){
data[i] = malloc((MAX_SIZE+1)*sizeof(char));
int end = atoi(positions[i]);
lseek(fd,0,start);
read(fd,data[i],(end-start));
start = end;
}
start = 0;
for(i=0; i<all_names; i++){
int end = atoi(positions[i]);
for(j=0;j<(end-start) ;j++){
printf("%c",data[i][j]);
}
printf("\n");
}
这应该可以正常工作。
我有一个二进制文件,我可以将其视为其中包含以这种方式存储的单词的文本:entry one entry two entry three(因此单独的条目是连续的,但单个条目可以包含两个由 [=32= 分隔的单词])
我有这个代码:
char **data;
int start = 0;
data = malloc(all_names * sizeof(char*));
fd=open(argv[1],O_RDWR|O_CREAT,S_IRWXU);
for(i=0; i<all_names; i++){
data[i] = malloc((MAX_SIZE+1)*sizeof(char));
int end = atoi(positions[i]);
read(fd,&data[i],(end-start));
start = end;
}
for(i=0; i<all_names; i++){
printf("%s\n", data[i]);
}
Positions 数组包含除第一个字符串之外的每个字符串的开始位置。
例如。如果 positions[0] = 9,这意味着第一个条目有 9 个字符,第二个条目的第一个字符是字节数 9.
我得到一个分段错误,似乎是在尝试打印数组后立即发生的,但我无法弄清楚它是由于错误打印还是首先没有正确存储单词引起的。
现在,我在创建 pos 数组时遇到了问题并问了一个类似的问题
fd=open(argv[1],O_RDWR|O_CREAT,S_IRWXU);
for(i=0; i<all_names; i++){
positions[i] =malloc((MAX_SIZE+1)*sizeof(char));
int end = atoi(positions[i]);
for(j=0;j<(end-start) ;j++){
read(fd,&data[i][j],1);
}
data[i][j]=0;
printf("%s\n",data[i]);
}
和打印时相同的代码,在同一点出现相同的段错误。
我尝试逐字符打印:
start = 0;
for(i=0; i<all_names; i++){
int end = atoi(positions[i]);
for(j=0;j<(end-start) ;j++){
printf("%c",data[i][j]);
}
printf("\n");
}
还是一样的问题。感谢您的帮助,如果您觉得有必要投反对票,请解释原因,以便我改进。如果需要更多信息,我会提供。
问题可能是您在读取文件时使用 &data[i]
得到的未定义行为。由于 data[i]
是指向某些数据的指针,因此 &data[i]
是指向该指针的指针,并且类型为 char **
.
删除 address-of 运算符并仅使用 data[i]
.
如 "Some programmer dude" 的回答所述,从 &data[i]
中删除 & 将消除段错误。我看到了您的评论,我认为您只是没有组合代码的正确部分。
data = malloc(all_names * sizeof(char*));
fd=open(argv[1],O_RDWR|O_CREAT,S_IRWXU);
for(i=0; i<all_names; i++){
data[i] = malloc((MAX_SIZE+1)*sizeof(char));
int end = atoi(positions[i]);
lseek(fd,0,start);
read(fd,data[i],(end-start));
start = end;
}
start = 0;
for(i=0; i<all_names; i++){
int end = atoi(positions[i]);
for(j=0;j<(end-start) ;j++){
printf("%c",data[i][j]);
}
printf("\n");
}
这应该可以正常工作。