【问题标题】:Segmentation fault (core dumped) case with fread带有 fread 的分段错误(核心转储)案例
【发布时间】:2013-06-28 20:44:46
【问题描述】:

有人能告诉我为什么这段代码会导致这样的错误吗?

unsigned char buffer;
fread(&buffer,1,1,image_ptr);
printf("%s ",buffer);

图像为 8 位灰度。谢谢。

【问题讨论】:

    标签: c segmentation-fault


    【解决方案1】:

    %s 是打印字符串的格式说明符,但buffer 不是字符串。这会导致未定义的行为。您想要 %c%u%x,具体取决于您想要的输出。

    【讨论】:

      【解决方案2】:

      %s 说明符用于字符串,即 char *,您传递的是 char,这不一样。

      printf 中使用%c 打印buffer

      printf("%c ", buffer);
      

      【讨论】:

      • %c 在“图像是 8 位灰度”的上下文中似乎没有意义。
      • 两个 cmets - unsigned char 在这里似乎比普通的旧 char 更合适。而%02X 在这里似乎是一个更合适的格式字符串之后你切换到unsigned char
      【解决方案3】:

      因为您将一个字节读入缓冲区并在 printf 中将其视为以 0 结尾的字符串。这会将@buffer 处的内存解释为指向 char 的指针(在大多数现代机器上,长度为 4 或 8 个字节),然后打印从该内存地址开始的字节,直到找到 0。

      这样你告诉 printf

      • 先读取变量缓冲区后面的 3-7 个字节
      • 以及从完全随机的内存地址中读取的字节

      访问不属于你的内存是未定义的行为,通常会出现分段错误。

      【讨论】:

      • 这个答案完全是错误的:这里无法访问“缓冲区后面的内存”。
      • @Employed 俄语:我的回答完全错误:是的。但是这里可以访问缓冲区后面的内存。查看我的编辑。
      【解决方案4】:

      用 %c 替换 %s .. %c 用于单个字符 %s 用于字符串(超过 1 个字符)

      【讨论】:

        猜你喜欢
        • 2017-08-18
        • 1970-01-01
        • 2016-03-19
        • 1970-01-01
        • 2015-06-25
        • 2021-06-03
        相关资源
        最近更新 更多