从原始文件读取时出现分段错误

时间:2018-08-16 14:51:59

标签: c segmentation-fault malloc

我正在尝试从原始文件中读取数据,并将其存储在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溢出,但是找不到与该特定问题相关的任何内容,因此如果已经回答了类似问题,我深表歉意。我可能正在做一些愚蠢的事情,或者没有正确使用某些东西。

谢谢

2 个答案:

答案 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,...