2017-03-17 116 views
4

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

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

+1

其实问题是你传递地址的第一个'%d':你应该使用'%p'。 'printf(“Address =%p,value =%d \ n”,(void *)p0,* p0);'对于第二个'char'值只是提升为'int'。 – LPs

+0

此外,错误/警告还取决于您如何编译代码:使用'gcc -Wall -Wextra -pedantic-errors test.c -o test -std = c11 -g',您有'warning':format'%d'需要参数类型'int',但参数2的类型为'char *'[-Wformat =] printf(“Address =%d,value =%d \ n”,p0,* p0);' – LPs

+0

[格式正确说明符打印指针(地址)?](http://stackoverflow.com/q/9053658/995714) –

回答

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); 

然后,回答

没有错误可言,为什么呢?

因为问题不在于编译器应该抱怨的语法或任何约束冲突。这是纯粹错误使用给定的电源。 :)

+0

请注意,一些编译器警告格式说明符不匹配。例如。最近版本的gcc和clang加上'-Wall' –

+0

谢谢@Sourav Ghosh –

+0

@ M.M .:也有很多非版本的版本。它当然在2.95(c。1999)中出现,我认为它已经很老了。 – rici

1

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

+2

'约束违规'...你能详细说明吗? –

+0

谢谢,只是downvoted,因为你是绝对错误的。 :) –

+0

@SouravGhosh你好先生,我改变了我的答案。 – rsp

相关问题