簡體   English   中英

當我嘗試讀取十六進制文件時,C 代碼中出現分段錯誤

[英]Segmentation Error in C code when i try to read the hex file

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

首先要說的是,由於mem2是由以下聲明的:

char mem[8],mem2[7];

也就是說,您嘗試使用以下命令返回指向char的指針:

return(mem2);

與在hex_pattern()的定義中聲明的返回類型hex_pattern() int類型的值:

int hex_pattern(int a) {}

雖然這本身可能會導致自身出現NULL指針(假設編譯器至少會在發出警告的情況下讓它通過),但如果您以正確的方式聲明/定義hex_pattern() ,您甚至會得到NULL

char* hex_pattern (int a){}


mem2指向mem2[]本地char數組的第一個元素的指針,但是在您將hex_pattern()返回給調用者后, mem2[]數組不再存在,這里是main()

默認情況下, mem2[]數組是存儲類auto (當您省略特定存儲類時),並且該存儲類的對象僅在定義/聲明的函數中處於活動狀態。 離開函數作用域時確定。

因此,指針指向NULL ,因為在指針指向的地址處,不再是存儲了有效值的有效對象。

如果你真的想返回整個mem2[]數組,這本身是不可能的,你可以找到最好的替代方法: 使用 C 返回數組


此外,您永遠不應該在return之后合並語句,就像您所做的那樣:

 return(mem2);
 fclose(fileptr); // Close the file

僅僅是因為這些語句沒有被執行的原因。 return是最后的聲明。 之后發生的一切都被忽略了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM