我正在尝试从原始文件中读取数据,并将其存储在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);
我已经尝试过搜索此问题并搜索Stack溢出,但是找不到与该特定问题相关的任何内容,因此如果已经回答了类似问题,我深表歉意。我可能正在做一些愚蠢的事情,或者没有正确使用某些东西。
谢谢
答案 0 :(得分:2)
您正在将指针的地址而不是指针所指向的地址传递给fwrite和fread,这会导致未定义的行为。您应该将指针的值(即分配给您的内存块的地址)传递给函数。
它应该是fread(buffer, 8, 1, rawfile);
而不是fread(&buffer, 8, 1, rawfile);
您的最佳示例也不起作用,未定义的行为只是...尚未定义。如果幸运的话,它会崩溃,否则,您可能会感到困惑。
答案 1 :(得分:1)
Ilya Bursow的评论为您提供了答案。
但是,以下事实有效:
fread(&buffer, 8, 1, rawfile);
因为您使用的是64位指针的64位系统。因此,您告诉fread
读取8个字节并将其放在指针中,该指针恰好是8个字节...
因此,以这种方式读取多于8个字节的内容将覆盖其他内存,从而导致未定义的行为。
查找fread
的描述。它会告诉它需要一个指向内存的指针,而不是指向内存的指针的地址(即不是指向内存的指针的指针)。而且由于buffer
已经是指针,所以您只需要编写fread(buffer,...