【问题标题】:` int a = 2; int b = a;` report unexpected error [duplicate]`int a = 2; int b = a;`报告意外错误[重复]
【发布时间】:2019-03-23 10:09:42
【问题描述】:

假设这样一个sn-p的最小代码:

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

【问题讨论】:

  • 要打印指针,请使用%p 而不是%d&amp;a 不是 int,而是指向 int 的指针。
  • 您的标题具有误导性。正如您在编译输出中看到的那样,这些是警告,由另一行产生。
  • &amp;a 是指向 int 的指针,因此在打印时使用 %p 并将类型转换为 void* 作为 p conversion specifier requires an argument of type void *
  • 编译器会在有错误的行下划线,并用简单的英文说明原因。
  • 我不得不说,随着编译器消息的传递,该消息特别有用且易于阅读。

标签: c


【解决方案1】:

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

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

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

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

【讨论】:

  • 您能否详细说明为什么推荐使用void* 的演员阵容?
  • @riderdragon &amp;aa 的地址,你上次查看时的值为2
  • @riderdragon 你认为地址运算符&amp;返回了什么? Address ofaddress-of 操作符产生其操作数的非左值地址,适合初始化指向操作数类型的指针。
  • @riderdragon a 是一个局部变量。 &amp;a 是应用于a 的地址运算符,提供a 的地址(指向a 类型的类型指针)。例如。 int a; &amp;a 将提供int* 类型的值(地址为a)。您可以将此值(指针)存储在另一个变量中:int a; int *pA = &amp;a; 现在,您又可以获得pA 的地址。但是:您无法获得&amp;a 的地址。返回的值是非左值,即没有可能被解决的必要存储。请区分“某物的地址”和“有地址的东西”。 &amp;a 是前者而不是后者。
  • 非常感谢您的耐心指导。 @Scheff
猜你喜欢
  • 2015-03-20
  • 2019-12-18
  • 2016-05-24
  • 2014-10-19
  • 2010-10-11
  • 1970-01-01
  • 1970-01-01
  • 2017-01-21
  • 2021-09-17
相关资源
最近更新 更多