此c程序中的错误格式警告
我试图在没有警告的情况下编译这个程序此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; } 我在64位ubuntu机器gcc版本4.6.3(ubuntu/Linaro 4.6.3-1ubuntu5)编译器上编译我的程序。&ar
#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;
}
我在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
,两者的意思相同。arr
的类型为int(*)[3]
,而不是int*
,尽管在大多数情况下,数组名会衰减为指向第一个元素的指针,即&arr[0]
在第二种情况下,这正是正常输出值2
的原因
但是,当arr
是&
运算符的参数时,它不会衰减。因此,&arr+1
具有与&arr[0]+3
等效的值。这是因为sizeof&arr
等于sizeof(int(*)[3])
,结果为3。因此,在尝试输出value1
时,您实际上正在访问&arr[3]
,其类型为int*
。它是&arr[3]
,而不是arr[3]
,因为当您取消引用某个具有int(*)[3]
类型的对象时,它会衰减为指针
因此,正如您所看到的,该警告确实在试图将您从潜在错误中解救出来
另请参见:逐步:
arr
是类型“int的数组3”
&arr
是类型“指向int数组3的指针”
&arr+1
也是类型“指向int数组3的指针”
*(&arr+1)
是类型“int的数组3”
将数组传递给函数时,会发生转换。传递的是数组第一个元素的地址,而不是数组本身。在本例中,它的类型为int*
“%d”
需要匹配的int
,因此编译器发出警告:
格式“%d”要求参数类型为“int”,但参数2的类型为“int*”
*(&arr+1)
-->地址arr
(作为指向一个3int
s数组的指针),由一个3int
s数组的大小偏移,然后取消引用以获得一个3int
s数组,该数组随后衰减为指向int
s的指针(它指向第四个int
超过arr
的原始开始,或者第二个int
数组的第一个int
从arr
的地址开始)。是的,我正在尝试做同样的事情。我正在寻找的是对此警告的合适解释。*(&arr[0])也给了我同样的警告。我把论点2误解为*(arr+1),这个警告是由它引起的。
warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘int *’ [-Wformat]
int arr[] = {1,2,3};