为什么由于将变量的地址分配给全局范围内的指针而收到警告错误?

why am i getting warnings errors due to assignment of a variable's address to a pointer in the global scope?

提问人:gontu sandeep 提问时间:1/9/2023 最后编辑:gontu sandeep 更新时间:1/9/2023 访问量:58

问:

这是我尝试编译程序时收到的警告的片段。我刚刚开始使用指针,由于某种原因,编译器标记了以下程序,我无法理解。代码如下:

#include <stdio.h>

int dec = 0;
int *d;
d = &dec;

int main() {
    return 0;
}

当我将这些声明塞入 main 的正文时,没有错误。我使用的 gcc 版本是 gcc 版本 12.2.0(使用 MSYS2 下载)和代码编辑器 MS visual code.任何人都可以对此进行解释吗?

正如我上面所说,我已经随机开始输入一个程序来熟悉指针,我希望无论指针在哪里声明和初始化,指针的处理方式都不会有任何变化。

C 指针 编译器错误 范围 警告

评论

2赞 Chris 1/9/2023
请养成避免使用全局变量或文件范围变量的习惯。越早停止使用全局变量就越容易。
2赞 Chris 1/9/2023
此外,如果您收到编译器警告/错误并想询问它们,请将它们包含在您的问题中。

答:

2赞 dbush 1/9/2023 #1

您正在尝试在函数之外执行分配,这是不允许的。您可以做的是初始化:

int *d = &dec;
1赞 Vlad from Moscow 1/9/2023 #2

只能在文件范围中使用声明。

在提供的程序中,您使用的是赋值语句

d = &dec;

在文件作用域中。因此,编译器会发出错误。

相反,你可以写例如

#include <stdio.h>

int dec = 0;
int *d = &dec;

int main( void ) {
    return 0;
}

由于变量具有静态存储持续时间,因此表达式是一个地址常量,并且 my 用作同样具有静态存储持续时间的变量的初始值设定项。dec&decd

从 C 标准(6.7.9 初始化)

4 初始值设定项中具有静态对象的所有表达式 或线程存储持续时间应为常量表达式或字符串 文字

和 (6.6 常量表达式)

7 允许初始值设定项中的常量表达式有更大的自由度。 这种常数表达式应是或计算为以下表达式之一 以后:

— 算术常数表达式,

— 一个空指针常量,

— 地址常量,或

— 完整对象类型的地址常量加或减去 整数常量表达式。

9 地址常量是一个空指针,一个指向左值的指针 指定静态存储持续时间的对象,或指向 功能指示符;它应该使用一元表显式创建 & 运算符或转换为指针类型的整数常量,或者 通过使用数组或函数类型的表达式隐式方式。这 array-subscript [] 和 member-access 。和 -> 运算符,地址和 和间接 * 一元运算符,指针强制转换可用于 创建地址常量,但对象的值应 不能使用这些运算符进行访问。