为什么在以下代码中出现编译错误“错误:'ptr'的类型冲突”? static int val = 33; int * ptr; // =&val; ptr =&val;

时间:2019-05-11 14:41:56

标签: c pointers static int

我的目标是使静态变量“ val”可用于其他.c文件(仅用于实验)。

因此,我创建了一个包含静态变量地址的全局指针,并试图通过该全局指针访问另一个文件中的静态变量的值。

但是

static int val=33;
int *ptr;
ptr = &val;

给我错误。

如果我这样做,它就可以工作。

static int val=33;
int *ptr = &val;

为什么?

2 个答案:

答案 0 :(得分:2)

static int val=33;
int *ptr;
ptr = &val; /* define a global variable with an init value */
global 范围内

定义全局变量,对于编译器,在ptr = &val;行中, ptr 的隐式类型为 int 。因此这与int*不兼容。您不能在全局范围内进行赋值,这就是ptr = &val;不是先前定义的 ptr 赋值,而是具有初始值的全局变量的定义的原因。

将代码放在本地范围内没有问题,例如

int main()
{
  static int val=33;
  int *ptr;
  ptr = &val; /* an assignment of ptr */
}

编译没有问题

答案 1 :(得分:1)

您使用的是旧的或质量差的编译器,其中假设int为丢失的类型。

在文件范围内,诸如ptr = &val;之类的表达式语句不是标准C的一部分。编译器正在尝试将其视为声明语句。为此,它假定类型为int,就像语句是:

int ptr = &val;

由于ptr先前已被声明为int *,因此此新的类型为int的声明发生了冲突,并且编译器报告存在冲突的类型。

C 2018 6.7.2 2为声明指定了约束

  

在每个声明的声明说明符中,以及在每个struct声明和类型名称的说明符限定符列表中,至少应提供一个类型说明符。

当违反约束时,编译器应发出有关该约束的诊断消息。因此,好的编译器会警告说缺少类型说明符(不仅是结果默认类型与先前的声明冲突)。