我试图读取一个十六进制文件,我将代码分为两部分,将文件数据加载到缓冲区,第二部分访问缓冲区以读取特定区域的数据。编译是干净的,但是当我运行测试时,它将引发分段错误

#包括
    #包括
    #包括

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/

10-11 21:17