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

3

我对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;
}

我声明了一个全局指针 p2,但是我试图将一个字符串 "hello" 赋值给它。
但是 QT 提示一个错误:重新定义了 'p2',类型不同:'int' vs 'char *'。
它说 p2 是一个 int?但我明明把它声明为一个 char *
然而,作为一个局部指针,p4 可以实现同样的功能!在 main 函数中一切正常。
发生了什么?我很困惑!
2个回答

8

发生的情况是你不能在全局作用域下运行代码。只有静态初始化器才被允许,并且它们必须是编译时常量。

有效:

char *p2;
int main()
{
    p2 = "world";
}

在这种情况下,错误消息可能并不是最有帮助的。全局范围里唯一允许存在的事物是声明或定义(可以有可选的初始化器),因此编译器认为 p2 = "world" 是在声明一个名为 p2 的新变量,隐式地将其类型设为 int ,然后发现与上面的p2声明产生了冲突,因此报错。

谢谢您的回复,现在 p2 可以随心所欲地玩耍了。 :) - Chris Liu

3

指令,如在此案例中的赋值操作,只能存在于函数内。在函数外,您只能声明或定义变量、类型或其他函数。

因此,当您在函数外部说 p2 = “world”; 时,编译器通过排除法推断出您必须正在声明一个变量,并且由于您没有给它一个类型,它会默认为 int 类型。所以您写的代码等同于:

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

此时,很明显它在告诉你正在重新定义p2为一个int

我只是在你发布回答的同时添加了一些与你回答路径相似的文本... - Joshua
谢谢你的回答,我现在明白了。这很有帮助。如果没有指定类型,C会默认假设变量为“int”。全局作用域变量可以进行声明或定义。 - Chris Liu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接