没有错误,为什么?

时间:2017-03-17 08:18:49

标签: c printf format-specifiers

我正在测试这段代码,但为什么没有错误?

#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是整数而不是字符,为什么没有错误?

2 个答案:

答案 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)

这是未定义的行为,因为p0char*,代码printf("Address = %d, value = %d\n", p0, *p0)%d不是字符指针的有效转换说明符。