`int y=&;的gcc错误;x`

`int y=&;的gcc错误;x`,c,gcc,C,Gcc,gcc给出错误:初始化器元素在加载时不可计算(错误类型): 但gcc编译此罚款(仅添加了*类型声明): 加载时,&x的哪个部分不可计算?(gcc需要编译的任何第1个铸入式src?) 编辑:原来gcc(V7LinuxAMD64)编译了这个src,为什么?(将int更改为long): Edit2:gcc 32位使用int编译第一个src。我猜类型强制不是在编译时完成的 Edit3:在int y=&x中,一个给定的不必要的类型“强制”是坏的src,&x是指向int的指针。不能将指针存储在int变量中

gcc给出
错误:初始化器元素在加载时不可计算(错误类型):

但gcc编译此罚款(仅添加了
*
类型声明):

加载时,
&x
的哪个部分不可计算?(gcc需要编译的任何第1个铸入式src?)


编辑:原来gcc(V7LinuxAMD64)编译了这个src,为什么?(将
int
更改为
long
):

Edit2:gcc 32位使用
int
编译第一个src。我猜类型强制不是在编译时完成的


Edit3:在
int y=&x中,一个给定的不必要的类型“强制”是坏的src

&x
是指向
int
的指针。不能将指针存储在
int
变量中。你的问题的答案是正确的

编辑:为什么
长y=&x工作?


这可能是因为
长的
足够大,可以在您的机器上放置指针但是,默认情况下,gcc应向您发出警告。使用
-Werror
运行gcc以防止它接受此代码。

我不确定错误消息是什么,但它与不能将整数变量设置为地址有关。您不应该使用
inty=&x
,因为该语句根本没有任何意义。您应该只为指针类型分配地址。

原因
长x=&y
未获得有关加载时不可计算的值的错误消息,即目标可执行文件格式具有解析地址的规定。也就是说,编译器和链接器可以将一些命令和数据放入目标文件和可执行文件中,这些文件表示“当您将此程序加载到内存中并为包含符号y的部分选择了起始地址时,请将y的地址放在位置x中。”这就是编译器制作
long x=&y工作:它告诉加载程序去做

intx=&y
确实收到错误消息,在这种情况下,将重新定位的地址放入x的命令将不起作用。在这种情况下,
int
x太小,无法容纳完整的地址,因此编译器需要一个命令,上面写着“获取y的地址,切掉高位,将低位放入x”。加载程序没有任何这样做的命令,因此编译器报告无法在加载时计算值


现在我们可以看到为什么
intx=&y不会出现错误:32位地址将适合32位
int
。它试图将64位地址放入32位
int
中,这是一个问题。

&x
是x的地址,因此是指向int的指针:但是在源代码中,
y
是int。将
int*
分配给
int
将导致编译器发出警告,因此这看起来非常好。此外,您应该使用
uintptr\t
来存储指针,而不是
int
int*
。您使用的是什么版本的GCC?这是一条异常糟糕的错误消息,让我想起了过去的日子。@DeiDei gcc 8.1对文件范围
x
y
给出了相同的错误消息。为什么长y=&x;按gcc编译?长y=&x在GCC中编译,因为GCC接受大量非标准代码作为扩展<代码>长y=&x不是有效的C。使用
-pedantic errors
使GCC为无效代码生成硬错误。虽然您不应该真正使用
int*
来存储指针,但是
(u)intptr\u t
。在我看来,
typedef
ed指针在C中不是一个好主意,因为它们是否需要被释放还不太清楚。@GregoireLodi,原来
int
在gcc amd64上失败,但在32位上编译。thx@GregoireLodi:您确实应该使用指针来存储指针。gcc在混合指针和整数方面非常松懈。如果要将指针值存储在整数中,则必须使用强制转换。
int x;
int y=&x; /* bad type */
int x;
int *y=&x;
int x;
long y=&x; /* bad type */