【问题标题】:Segmentation Fault when reading from raw file从原始文件读取时出现分段错误
【发布时间】:2018-08-16 14:51:59
【问题描述】:

我正在尝试从原始文件中读取数据并将它们存储在 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);

我已尝试在 Google 上搜索此问题并通过 Stack Overflow 进行搜索,但找不到与此特定问题相关的任何内容,因此如果此类问题已得到解答,我深表歉意。我可能在做一些愚蠢的事情或没有正确使用某些东西。

谢谢

【问题讨论】:

  • 在 fread/fwrite 中删除 & 之前的 buffer
  • 我之前尝试过,虽然我可以存储更多字节,但它最多只能存储 521 个字节。如果我再存储,我会收到此错误:“free(): invalid next size (normal): 0x0000000002197490 ***”。我认为在存储超过 512 个字节后会出现错误,但直到达到 522 才会出现错误。会碰巧知道为什么吗?我只是想更好地了解这是如何工作的。谢谢!
  • 如果你要求 512 的内存,那么这就是你得到的。所以你不能在那里存储超过 512 个字节。你所做的就像在没有足够的钱的情况下买东西。
  • 当系统确定有问题时,您会收到错误(如果有)。这可以是立即的、稍后的,甚至永远不会(并且从不包括“没有消息但错误的结果”)

标签: c segmentation-fault malloc


【解决方案1】:

您将 指针的地址 而不是 指针指向的地址 传递给 fwrite 和 fread ,这会导致未定义的行为。您应该将指针的值(即您分配的内存块的地址)传递给函数。

应该是fread(buffer, 8, 1, rawfile); 而不是fread(&buffer, 8, 1, rawfile);

您的顶级示例也不起作用,未定义的行为只是……未定义。如果幸运,它会崩溃,否则您可能会感到困惑。

【讨论】:

    【解决方案2】:

    Ilya Bursow 的评论给你答案。

    但是,以下是有效的事实:

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

    是因为您使用的是 64 位系统,其中指针是 64 位的。所以你告诉fread 读取 8 个字节并将其放入指针中,正好是 8 个字节...

    因此,以这种方式读取超过 8 个字节的内容会覆盖其他内存,从而导致未定义的行为。

    查找fread 的描述。它会告诉它需要一个指向内存的指针,而不是指向内存的指针的地址(即不是指向内存指针的指针)。而且由于buffer已经是指针,你只需要写fread(buffer,...

    【讨论】:

    • "以这种方式读取超过 8 个字节的内容会覆盖其他内存,导致未定义的行为。" -- 读取任何超过 0 字节的内容(即读取任何内容)会破坏指针,该指针稍后会传递给 free -- 因此无论哪种方式都有未定义的行为。
    • @EmployedRussian,当然,但 fread 工作(解释他的问题)。
    猜你喜欢
    • 2020-08-14
    • 1970-01-01
    • 1970-01-01
    • 2015-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多