【发布时间】:2013-06-28 20:44:46
【问题描述】:
有人能告诉我为什么这段代码会导致这样的错误吗?
unsigned char buffer;
fread(&buffer,1,1,image_ptr);
printf("%s ",buffer);
图像为 8 位灰度。谢谢。
【问题讨论】:
标签: c segmentation-fault
有人能告诉我为什么这段代码会导致这样的错误吗?
unsigned char buffer;
fread(&buffer,1,1,image_ptr);
printf("%s ",buffer);
图像为 8 位灰度。谢谢。
【问题讨论】:
标签: c segmentation-fault
%s 是打印字符串的格式说明符,但buffer 不是字符串。这会导致未定义的行为。您想要 %c 或 %u 或 %x,具体取决于您想要的输出。
【讨论】:
%s 说明符用于字符串,即 char *,您传递的是 char,这不一样。
在printf 中使用%c 打印buffer:
printf("%c ", buffer);
【讨论】:
%c 在“图像是 8 位灰度”的上下文中似乎没有意义。
unsigned char 在这里似乎比普通的旧 char 更合适。而%02X 在这里似乎是一个更合适的格式字符串之后你切换到unsigned char。
因为您将一个字节读入缓冲区并在 printf 中将其视为以 0 结尾的字符串。这会将@buffer 处的内存解释为指向 char 的指针(在大多数现代机器上,长度为 4 或 8 个字节),然后打印从该内存地址开始的字节,直到找到 0。
这样你告诉 printf
访问不属于你的内存是未定义的行为,通常会出现分段错误。
【讨论】:
用 %c 替换 %s .. %c 用于单个字符 %s 用于字符串(超过 1 个字符)
【讨论】: