c - `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
,但编译器提醒信息很难理解。
解决方案
您正在尝试使用%d
格式说明符打印指针,该说明符用于打印int
. 这就是你收到警告的原因。
要打印指针,请使用%p
格式说明符:
printf("a = %d, &a = %p", a, (void*)&a);
printf("b = %d, &b = %p", b, (void*)&b);
此外,请务必将指针转换为void *
. 这样做的原因是因为并非所有指针类型都必须具有相同的表示形式,并且可变参数函数无法正确进行转换,因为它不知道实际类型是什么。所以需要一个明确的演员void *
表。
推荐阅读
- python - 我正在制作一个不和谐的机器人,它会根据反应赋予角色。我不断收到缺少权限的错误
- docker - 基于 OWASP ZAP 代理脚本的身份验证 - 如何自动化
- android - Xamarin Form CollectionView ItemTemplate:如何从 ContentView 内的 Image.GestureRecognizers 发送命令
- html - 如何使顶部栏在移动视图中响应?
- c# - 如何在 Xamarin Forms App 中实现构造函数注入?
- jquery - 无法让 jquery 触发点击工作,尝试在没有表单提交的情况下加载新页面
- html - -webkit- 范围滑块:更改外观或滑块垂直但不是两者?
- erlang - 如何解决`非法指令:4`elixir包崩溃
- python - 两个矩阵相乘时出错(mat1 和 mat2 形状不能相乘)
- foreach - 必须声明元素类型“foreach” - mybatis