我正在阅读关于C的练习册并且发现了声明
printf("%c", "\n");
在控制台中运行时仍然有效但显示“$”符号。
为什么这句话没有像
那样使控制台崩溃printf("%s", '\n');
确实
答案 0 :(得分:3)
双引号字符串会生成指向char
(又名char*
)的指针值,而单引号会生成一个字符值(使用ASCII值为什么)在引号中。在某些编译器中,您可以将多个字符堆叠到单引号中。
printf("%c", *("\n") );
会打印您的换行符,因为*
运算符会取消引用指针
(你可能会做*"\n"
,我只是在编写表达式时保守一些)
printf("%s", '\n');
崩溃,因为%s
需要一个指针,并且一个指针的换行符指向杂草,很可能导致无效的内存访问
答案 1 :(得分:3)
它将通过传递具有错误类型的数据来调用未定义的行为。它只是发生而不是崩溃。
在某些实现中,从字符串文字转换的指针作为参数传递。与%s
不同,%c
将参数解释为指针并转到读取,{{1}}只会将参数作为数字并打印出来,因此崩溃的机会较少。
答案 2 :(得分:2)
因为%s
需要NUL
终止字符串,其中%c
只需要一个字符。字符串将读取缓冲区的末尾(单个字符),查找NUL
,很可能导致内存异常。或不 - 因此未定义的行为。
答案 3 :(得分:0)
只有后一个语句要求实现取消引用无效指针。无效值通常显示为垃圾。但是大多数可能的内存位置值都是不可访问的,尝试访问它们会导致现代操作系统崩溃。
答案 4 :(得分:0)
%s打印,直到达到' \ 0'因为\ n没有转义它将读入内存。 "%C"只需要一个字符