void *,字符串和字符的指针

问题描述 投票:0回答:1
#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不同?如果他们只是地址那么为什么不同?(我真的很抱歉我做的最后一分钟改变:/)

c pointers void-pointers
1个回答
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通常不是很有用。

© www.soinside.com 2019 - 2024. All rights reserved.