我正在测试这段代码,但为什么没有错误?
#include <stdio.h>
int main()
{
int a = 1025;
int *p;
p = &a;
// now I declare a char variable ,
char *p0;
p0 = (char*) p; // type casting
printf("", sizeof(char));
// is %d correct here ?????
printf("Address = %d, value = %d\n", p0, *p0);
}
我的问题:
这里%d
是否正确?因为%d
是整数而不是字符,为什么没有错误?
答案 0 :(得分:4)
在你的情况下
p0 = (char*) p;
有效,因为char *
可用于访问任何其他类型。相关,引用C11
,章节§6.3.2.3
[...]当指向对象的指针转换为指向字符类型的指针时, 结果指向对象的最低寻址字节。连续增量 结果,直到对象的大小,产生指向对象剩余字节的指针。
然而,在
的情况下 printf("Address = %d, value = %d\n", p0, *p0);
导致undefined behavior,因为您将指针(p0
)传递给%d
(查看转换说明符的第一个“对”和相应的参数)。您应该使用%p
并将参数转换为void *
,类似
printf("Address = %p, value = %d\n", (void *)p0, *p0);
然后,回答
根本没有错误,为什么?
因为问题不在于编译器应该抱怨的语法或任何约束违规。这纯粹是误用了给定的力量。 :)
答案 1 :(得分:1)
这是未定义的行为,因为p0
是char*
,代码printf("Address = %d, value = %d\n", p0, *p0)
和%d
不是字符指针的有效转换说明符。