簡體   English   中英

從原始文件讀取時出現分段錯誤

[英]Segmentation Fault when reading from raw file

我正在嘗試從原始文件中讀取數據,並將其存儲在char *類型的緩沖區中,然后將其存儲在jpg文件中,由於某種原因,我一直收到“分段錯誤”錯誤。

我正在使用malloc()函數為緩沖區分配512字節的內存,但是在收到錯誤之前,我一次最多只能讀取8個字節(我試圖一次讀取512字節)。

這是我的代碼:

char *rawfilename = argv[1];

FILE *rawfile = fopen(rawfilename, "r");

if(rawfile == NULL)
{
    fprintf(stderr, "Could not open %s.\n", rawfilename);
    return 2;
}

char imgfilename[] = "image0.jpg";

FILE *imgfile = fopen(imgfilename, "w");

char *buffer = malloc(512 * sizeof(char));


//This works

fread(&buffer, 8, 1, rawfile);

fwrite(&buffer, 8, 1, imgfile);

/////////


//This doesn't work

fread(&buffer, 512, 1, rawfile);

fwrite(&buffer, 512, 1, imgfile);

/////////


free(buffer);

fclose(rawfile);

fclose(imgfile);

我已經嘗試過搜索該問題並搜索堆棧溢出,但找不到與該特定問題相關的任何內容,因此如果已經回答了類似問題,我深表歉意。 我可能正在做一些愚蠢的事情,或者沒有正確使用某些東西。

謝謝

您正在將指針地址而不是指針指向地址傳遞到fwrite和fread中,這會導致未定義的行為。 您應該將指針的值(即分配給您的內存塊的地址)傳遞給函數。

應該是fread(buffer, 8, 1, rawfile); 而不是fread(&buffer, 8, 1, rawfile);

您的最佳示例也不起作用,未定義的行為只是...尚未定義。 如果幸運的話,它會崩潰,否則,您可能會感到困惑。

Ilya Bursow的評論為您提供了答案。

但是,以下事實有效:

fread(&buffer, 8, 1, rawfile);

因為您使用的是64位指針的64位系統。 所以你告訴fread讀取8個字節並將其放在指針中,這恰好是8個字節...

因此,以這種方式讀取多於8個字節的內容將覆蓋其他內存,從而導致未定義的行為。

查找的descripion fread 它會告訴它需要一個指向內存的指針,而不是指向內存的指針的地址(即,不是指向內存的指針的指針)。 並且由於buffer已經是指針,因此您只需要編寫fread(buffer,...

暫無
暫無

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

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