我试图读取一个十六进制文件,我将代码分为两部分,将文件数据加载到缓冲区,第二部分访问缓冲区以读取特定区域的数据。编译是干净的,但是当我运行测试时,它将引发分段错误
#包括
#包括
#包括
char *fip_buffer;
char *emmc_pattern_buffer;
char hex_pattern() {
FILE *fileptr;
char *buffer;
long filelen;
int i,j;
fileptr = fopen("fip.hex", "rb");
if( fileptr == NULL ) {
printf("cannot open file");// exit(1);
}
fseek(fileptr, 0, SEEK_END);
filelen = ftell(fileptr);
rewind(fileptr);
fip_buffer = (char *)malloc((filelen+1)*sizeof(char));
for(i = 0; i < filelen; i++) {
fread(fip_buffer+i, 1, 1, fileptr);
}
fclose(fileptr); // Close the file
return(fip_buffer);
}
char hex_pattern_read(int a, int filelen){
char mem[8],mem2[7];
int i,j;
for(i=a;i<filelen;i++){
mem[j]=fip_buffer[i];
mem[8]='\0';
j++;
if(j==8){strcpy(mem2,mem);j=0; break;
}
}
emmc_pattern_buffer=mem2;
return(emmc_pattern_buffer);
}
int main(int argc, char **argv) {
printf("Reading hex file");
int i,j;
hex_pattern();
int len = strlen(fip_buffer);
printf("size of buffer is=%d\n%s\n",len,fip_buffer);
for(i=0; i<2; i++){
// printf("Entered loop1");
for(j=0;j<3;j++){
int temp = (j*8)+(128*i);
hex_pattern_read(temp,len);
printf("%s\n",emmc_pattern_buffer);
}
}
return 0;
}
最佳答案
首先要说的是,由于mem2
是通过以下方式声明的:
char mem[8],mem2[7];
也就是说,您尝试使用以下命令返回指向
char
的指针:return(mem2);
与
hex_pattern()
定义中声明为返回类型的内容相反; int
类型的值:int hex_pattern(int a) {}
尽管这本身可能会导致
NULL
指针本身(假定编译器至少会通过警告让它通过),但如果您使用以下正确方式声明/定义NULL
,则您甚至会得到hex_pattern()
:char* hex_pattern (int a){}
mem2
是指向char
的本地mem2[]
数组的第一个元素的指针,但是在将mem2[]
留给调用者(这里是hex_pattern()
)之后,main()
的数组不再存在。mem2[]
数组默认情况下是存储类auto
(当您省略特定的存储类时),并且该存储类的对象仅在定义/声明的函数中存在。在离开功能范围时确定。因此,指针指向
NULL
,因为指针指向的地址不再是存储了有效值的有效对象。如果您真的想返回整个
mem2[]
数组,而这是不可能单独完成的,则可以在这里找到最佳的替代方法:Returning an array using C同样,您绝不应该在
return
之后并入语句,就像您使用的那样: return(mem2);
fclose(fileptr); // Close the file
仅仅是因为这些语句不被执行的原因。
return
是最终声明。此后发生的一切都将被忽略。关于c - 当我尝试读取十六进制文件时,C代码出现段错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59701606/