我试图在没有警告的情况下编译这个程序,
#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] + 1
或 arr + 1
,它们的意思相同。
关于c - 此 c 程序中的错误格式警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34986567/