`int a = 2; int b = a;`报告意外错误

时间:2018-10-18 14:49:18

标签: c

假设这样的代码片段最少:

#include <stdio.h>
int main(void)
{
    int a = 2;
    int b = a;
    printf("a = %d, &a = %d", a, &a);
    printf("b = %d, &b = %d", b, &b);

    return 0;
}

我运行它并得到错误报告为:

test.c:6:31: warning: format specifies type 'int' but the argument has type 'int *' [-Wformat]
        printf("a = %d, &a = %d", a, &a);
                             ~~      ^~
test.c:7:31: warning: format specifies type 'int' but the argument has type 'int *' [-Wformat]
        printf("b = %d, &b = %d", b, &b);
                             ~~      ^~
2 warnings generated.

我假设a = 2 b = 2等同于a = b = 2,尽管如此,编译器提醒信息还是很难理解。

1 个答案:

答案 0 :(得分:4)

您正在尝试使用%d格式说明符来打印指针,该说明符用于打印int。这就是为什么您收到警告。

要打印指针,请使用%p格式说明符:

printf("a = %d, &a = %p", a, (void*)&a);
printf("b = %d, &b = %p", b, (void*)&b);

此外,请确保将指针强制转换为void *。这样做的原因是因为并非所有指针类型都必须具有相同的表示形式,并且可变参数函数无法正确执行转换,因为它不知道实际的类型是什么。因此,需要显式转换为void *