c - 当我尝试读取 hex 文件时 C 代码中的分段错误
问题描述
我试图读取一个十六进制文件,我已将我的代码分成两部分,将文件数据加载到缓冲区,第二部分访问缓冲区以读取特定区域数据。编译很干净,但是当我运行测试时,它会引发分段错误
#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; }
解决方案
首先要说的是,因为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
是最后的陈述。之后发生的一切都被忽略。
推荐阅读
- java - 无法拦截 Spring @Async
- junit - 如果假设不满足,防止 jUnit 失败
- angular - “是否有任何支持 .au 格式的 HTML5 音频播放器?或任何外部插件?”
- laravel - 如何在 Laravel 中使用参数制作路由 API
- java - 如何以更高的像素密度显示我的 Java (Swing GUI) 应用程序?
- numpy - 如何计算scipy中的泊松随机变量概率?
- spring - 有什么方法可以强制 Spring 在应用程序启动时检查 EL 表达式?
- python - 如何用自定义管理员替换整个默认 Djnago 管理员
- node.js - aws-xray 捕获AWS 注释
- xml - XSLT对不同父节点下的子节点进行排序