GCC对int*a={1,2,3,4,5}的语句做了什么? #包括 int main(){ int*a={1,2,3,4,5}; printf(“a:%x&a:%x\n”,a,&a); 返回0; }
我用GCC编译了这个程序。GCC对int*a={1,2,3,4,5}的语句做了什么? #包括 int main(){ int*a={1,2,3,4,5}; printf(“a:%x&a:%x\n”,a,&a); 返回0; },c,gcc,C,Gcc,我用GCC编译了这个程序。 a的输出是1,而&a的输出是地址。 GCC对int*a={1,2,3,4,5}做了什么?GCC是否将其视为数组或指向数组或其他对象的指针?我没有参考C标准,但您可以从编译警告消息中看到GCC如何处理此问题: [步骤101]#cat foo.c int main() { int*a={1,2}; 返回!!a; } [步骤102]#通用条款-沃尔富 foo.c:在函数“main”中: foo.c:3:16:警告:初始化从整数生成指针 没有强制转换[-Wint转换] int
a
的输出是1
,而&a
的输出是地址。
GCC对int*a={1,2,3,4,5}做了什么?GCC是否将其视为数组或指向数组或其他对象的指针?我没有参考C标准,但您可以从编译警告消息中看到GCC如何处理此问题:
[步骤101]#cat foo.c
int main()
{
int*a={1,2};
返回!!a;
}
[步骤102]#通用条款-沃尔富
foo.c:在函数“main”中:
foo.c:3:16:警告:初始化从整数生成指针
没有强制转换[-Wint转换]
int*a={1,2};
^
foo.c:3:16:注意:(接近“a”的初始化)
foo.c:3:19:警告:标量初始值设定项中的元素过多
int*a={1,2};
^
foo.c:3:19:注意:(接近“a”的初始化)
[步骤103]#
更新:
只需查看,并在第6.7.8节初始化中找到:
标量的初始值设定项应为单个表达式,可以选择用大括号括起来。
该代码违反了约束,因为非聚合的初始值设定项只能包含1个元素 GCC有一个“扩展”来忽略多余的初始值设定项,因此它将代码视为
int*p=1代码>。这也是一种约束冲突,因为不能将整数指定给指针。但是gcc有另一个“扩展”来处理这样的代码,比如int*p=(int*)1代码>。因此,您将得到一个指向地址1的指针
&a的输出是一个地址
&a
是变量a
在内存中的地址,这与a
中存储的值无关不要发布代码的图片,发布实际代码。不是因为我们无法读取代码的图像,而是因为它们是代码,应该这样发布。有人可能还想复制并粘贴它来运行它。在大多数情况下int*a={1,2,3,4,5}代码>真的吗?逗号在这里用作运算符。这就是为什么当a={1,2,3,4,5}等价于“(a=1),2,3,4,5”)时,会得到a=1,*a指向一个整数。
#include <stdio.h>
int main(){
int *a = {1,2,3,4,5};
printf("a:%x &a:%x\n",a,&a);
return 0;
}