#include<stdio.h>
#include<conio.h>
void main()
{
char cr[] = "Yash";
clrscr();
printf("%p\n",(void*)cr);
printf("%p\n",cr);
printf("%p\n",&cr);
printf("%p\n",&cr[0]);
printf("%p\n",cr[0]);
printf("%p\n",(void*)cr[0]);
printf("%c\n",&cr[0]);
printf("%s\n",&cr);
printf("%c\n",(void*)cr[0]);
printf("%s\n",(void*)cr);
getch();
}
输出:
FFEE
FFEE
FFEE
FFEE
0059
0059
ε
Yash
Y
Yash
问题:
我无法完全理解我在此代码中得到的输出。有人可以解释每个输出为什么它是这样的。特别是为什么printf("%c",&cr[0]);
给了ε
这个奇怪的或者可能是空符号?
为什么(void*)cr[0]
和cr[0]
的输出与%p
的一半中的其他3的输出不同?如果他们只是地址那么为什么不同呢?(我真的很抱歉我做的最后一分钟改变:/)
答案 0 :(得分:3)
解释每个输出
UB 未定义的行为:任何都可能发生。
"%p"
需要void*
。指向字符的指针和void*
具有相同的表示。
char cr[] = "Yash";
printf("%p\n",(void*)cr); // OK: address of CR[0]
printf("%p\n",cr); // OK: address of CR[0]
printf("%p\n",&cr); // UB, &cr is neither a void * or pointer to a character
printf("%p\n",&cr[0]); // OK: address of CR[0]
printf("%p\n",cr[0]); // UB cr[0] is neither a void * or pointer to a character
printf("%p\n",(void*)cr[0]); // UB, conversion to void* from arbitrary integer
"%s"
期望char*
到有效的字符串
printf("%s\n",&cr); // UB, Not a `char *`
printf("%s\n",(void*)cr); // OK
"%c"
需要int
,将其转换为unsigned char
并打印该字符。
printf("%c\n",&cr[0]); // UB, pointer passed as int
printf("%c\n",(void*)cr[0]); // UB, pointer passed as int
为什么
printf("%s",&cr);
会给......
printf("%s",&cr);
- &gt; printf
期望&cr
成为指向字符串的有效指针。它不是。结果:未定义的行为 - 可能发生任何事情。
为什么(void *)cr [0]和cr [0]的输出与&#34;%p
的一半中的其他3的输出不同
printf("%p\n",(void*)cr[0]);
和printf("%p\n",cr[0]);
是UB。
在UB发生时解释输出是没有效率的,直到有人清楚地理解为什么解释UB通常不是很有用。