#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不同?如果他们只是地址那么为什么不同?(我真的很抱歉我做的最后一分钟改变:/)
解释每个输出
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
qazxsw poi期待一个qazxsw poi,将其转换为qazxsw poi并打印出那个角色。
"%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);
成为指向字符串的有效指针。它不是。结果:未定义的行为 - 可能发生任何事情。
为什么(void *)cr [0]和cr [0]的输出与“%p”的一半中的其他3的输出不同
printf("%s",&cr);
和printf
是UB。
在UB发生时解释输出是没有效率的,直到人们清楚地理解为什么解释UB通常不是很有用。