C 中指针变量的类型冲突(错误)

de_*_*ust 3 c variables pointers compiler-errors

(1)

#include <stdio.h>
#include <stdlib.h>

int a = 10, b = 20 , c = 30, d, e, *pa, *pb, *pc;

d= 10;
e= 100;

pa = &a;
pb = &b;

int main()
{
    printf("%i, %i, %i, %i", pa, pb, d, e);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

(2)

#include <stdio.h>
#include <stdlib.h>

int a = 10, b = 20 , c = 30, d, e, *pa, *pb, *pc;

d= 10;
e= 100;

int main()
{
    pa = &a;
    pb = &b;

    printf("%i, %i, %i, %i", pa, pb, d, e);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

为什么在主函数(1)之外初始化指针变量 pa 和 pb 时会出现错误?当 pa 和 pb 在 main 函数内时,它工作得很好(2)。为什么我可以在主函数 (d,e) 之外初始化普通变量而不是指针变量?

我在 CodeBlocks 中收到的错误消息是: pa 的文件类型冲突。pa 的先前声明在这里:第 4 行。

M.M*_*M.M 6

可执行代码必须在函数内部。这是因为 C 程序的执行流程始于调用main().

类似int a = 10;的行被称为声明,它们可能被认为是在程序开始之前“发生”的。通常,编译器会生成一个包含所有全局变量数据的块,并在启动程序时加载它。

当您d = 10;在文件范围内写入时,这将被视为int d = 10;. 由于文件范围内不允许使用语句,因此它不是赋值语句。编译器认为这是一个声明,您打算在其中编写int但希望通过省略它来节省输入。

这被称为隐式 int并且 C89 拥有它,尽管它在 C99 中被删除了。

因此,当您编写时pa = &a;,隐式 intint pa = &a;会产生错误,因为您已pa使用 type声明,int *然后再次使用 声明int,它们是不同的类型。

但是,只要第一个变量没有初始化程序int,就可以将变量声明为 as然后将其重新声明为int(就像你对dand所做的那样e)。这称为暂定定义

为了避免这一切,请确保任何不是声明的代码都在函数内部。您可以在文件范围内写入:

int a = 5;
int *pa = &a;
Run Code Online (Sandbox Code Playgroud)

等等。


此外,printf("%i, %i, %i, %i", pa, pb, d, e);导致未定义的行为。该%i说明符必须匹配的int。要解决此问题,您需要传递(int)pa而不是pa等,或者使用说明%p符。