[英]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.