首页 > 解决方案 > 当我尝试读取 hex 文件时 C 代码中的分段错误

问题描述

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

    #include #include #include

    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;
    
    } 
    

标签: c

解决方案


首先要说的是,因为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是最后的陈述。之后发生的一切都被忽略。


推荐阅读