Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
此c程序中的错误格式警告_C - Fatal编程技术网

此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
(作为指向一个3
int
s数组的指针),由一个3
int
s数组的大小偏移,然后取消引用以获得一个3
int
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};