首页 > 解决方案 > `int a = 2; int b = a;` 报告意外错误

问题描述

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

#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,但编译器提醒信息很难理解。

标签: c

解决方案


您正在尝试使用%d格式说明符打印指针,该说明符用于打印int. 这就是你收到警告的原因。

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

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

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


推荐阅读