c - 此 c 程序中的错误格式警告

标签 c

我试图在没有警告的情况下编译这个程序,

#include<stdio.h>
int main()
{
    int arr[] = {1,2,3};
    printf("value1 = %d value2 %d\n", *(&arr+1), *(arr+1));//here is the warning
    return 0;
}

但是我收到编译时警告

warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘int *’ [-Wformat]

我正在 64 位 ubuntu 机器上编译我的程序 gcc 版本 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5) 编译器。

最佳答案

&arr 获取数组的地址,它是一个数组指针(不要与指向第一个元素的指针混淆)。它的类型为 int(*)[3]

然后你对这个数组指针做指针运算。由于它指向一个包含 3 个整数的数组,&arr + 1 将意味着“加上一个整个数组的大小”,您最终指向的只是声明的数组,这没有任何意义。

然后用* 获取数组指针的内容。然后您将再次获得数组本身。当您在表达式中创建数组时,它会退化为指向其第一个元素 int* 的指针。这与 int 不兼容,因此出现错误。

我猜您可能正在尝试执行 &arr[0] + 1arr + 1,它们的意思相同。

关于c - 此 c 程序中的错误格式警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34986567/

相关文章:

c - '.' 在 c 中作为 opendir 的参数表示什么?

c - 在c中的无限循环内更新数据

c - 您一般如何从用户模式代码中检测缓存行关联性?

c - 了解 C 指针、数组和负索引

c - 为什么我的 C 动态数组给我访问冲突?

c - 如何在 C 文件中通过 F12 或 Ctrl-Shift-O 使用 JUMP 功能?

c - 何时定义 GTK 类,何时使用信号?

c - 从 fgets() 输入中删除尾随换行符

c - 数组静态声明中第一个元素的地址

c - 当 CPU 为 32 位处理器时,以下代码内存丢失