带有fread的分段错误(核心转储)案例

时间:2013-06-28 20:44:46

标签: c segmentation-fault

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

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

图像为8位灰度。谢谢。

4 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:5)

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

使用%c中的printf打印buffer

printf("%c ", buffer);

答案 2 :(得分:3)

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

这样你告诉printf

  • 首先读取变量缓冲区后面的3-7个字节
  • 和来自完全随机存储器地址的读取字节

访问您不拥有的内存是未定义的行为,通常会受到分段错误的影响。

答案 3 :(得分:1)

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