假设这样的代码片段最少:
#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
,尽管如此,编译器提醒信息还是很难理解。
答案 0 :(得分:4)
您正在尝试使用%d
格式说明符来打印指针,该说明符用于打印int
。这就是为什么您收到警告。
要打印指针,请使用%p
格式说明符:
printf("a = %d, &a = %p", a, (void*)&a);
printf("b = %d, &b = %p", b, (void*)&b);
此外,请确保将指针强制转换为void *
。这样做的原因是因为并非所有指针类型都必须具有相同的表示形式,并且可变参数函数无法正确执行转换,因为它不知道实际的类型是什么。因此,需要显式转换为void *
。