为什么全局指针不能重新指向另一个对象,而局部指针可以?

Chr*_*Liu 3 c pointers

我是 C 的新手,尤其是 C 指针的新手。这里的问题很简单:

#include <stdio.h>

char *p1 = "Hello";
char *p2;
p2 = "world";  // error: redefinition of 'p2' with a different type: 'int' vs 'char *'

int main()
{
   char *p3 = "Hello";
   char *p4;
   p4 = "world";  // OK!  p4 can re-point to somewhere
   
   return  0;
}
Run Code Online (Sandbox Code Playgroud)

我声明了一个全局指针p2,但我尝试为其分配一个字符串"hello"? 。
但是QT提示一个错误: redefinition of 'p2' with a different type: 'int' vs 'char *'

它说p2是一个int?但我清楚地宣布它是char *;

但是,p4作为本地指针,可以做同样的事情!一切正常main

这是怎么回事?我很困惑!

Jos*_*hua 8

发生的事情是您无法在全局范围内运行代码。只允许使用静态初始值设定项,并且它们必须是编译时常量。

作品:

char *p2;
int main()
{
    p2 = "world";
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,错误消息可能不是最有帮助的。唯一可以存在于全局范围内的是声明或定义(带有可选的初始值设定项),因此编译器认为p2 = "world"是声明p2为一个新变量,给它隐式 type int,然后看到它与p2上面的声明冲突并抱怨。