gpt4 book ai didi

c - 当我尝试读取十六进制文件时,C 代码出现段错误

转载 作者:行者123 更新时间:2023-11-30 20:28:53 24 4
gpt4 key购买 nike

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

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

    }

最佳答案

首先要说的是,从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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com