C语言 为什么在全局区域初始化字符串为NULL后,无法将字符指针分配给字符串

bq9c1y66  于 2024-01-06  发布在  其他
关注(0)|答案(1)|浏览(120)

当我试图初始化一个char指针为NULL,然后试图将其分配给一个字符串时,它会给我如下的构建错误:

error: type specifier missing, defaults to 'int'; ISO C99 and later do not support implicit int [-Wimplicit-int]
Ptr = "NULL";
^
int
error: redefinition of 'Ptr' with a different type: 'int' vs 'char *'
note: previous definition is herechar *Ptr = NULL;

字符串
我试着去理解但我不能。
所以我尝试了下面的代码,但是当我给指针一个NULL的初始值,然后试图改变它时,它总是给我一个构建错误。

char *Ptr = NULL;
Ptr = "NULL";
int main()
{
    return 0;
}


如果我直接将指针初始化为一个字符串,它会工作......它也会工作在下面[作为本地]

int main()
{
    char *Ptr = NULL;
    Ptr = "NULL";
    return 0;
}


有人能解释一下那里的情况吗?

a8jjtwal

a8jjtwal1#

在C语言中,你不能在函数之外执行代码。语言的设计并不支持这一点。然而,你可以初始化在函数之外定义的变量,只要你将它们初始化为编译时常量。

  • char *Ptr = NULL;就是这样一个初始化,它是有效的C。
  • Ptr = "NULL";不是初始化,因为没有指定变量类型。相反,这看起来像是一个运行时赋值,不能放在函数体之外。

你的编译器实际上认为Ptr = "NULL";是一个单独的变量定义和初始化。所以首先你定义并初始化一个变量Ptr,然后编译器认为你是第二次这样做。
第一个错误“错误:类型说明符丢失,默认为'int'“弹出,因为编译器认为这是旧的遗留“C90”代码。在过去,声明变量而不指定类型是有效的,在这种情况下,它将隐式默认为int。这种行为在1999年的C99版本中被删除。
第二个错误是第一个错误的后续-因为编译器认为你想写int Ptr = "NULL";,它检测到与前一个变量char* Ptr冲突,因此“错误:用不同的类型重新定义'Ptr':'int' vs 'char'”
在这里我们可以注意到变量声明和定义之间的区别。我们可以在文件范围内多次声明一个变量,只要每个声明具有相同的类型-这意味着用于在多个文件之间通过外部链接共享变量。但是在项目中只能有一个变量的定义,并且一旦你添加了初始化器,你就有了一个定义。
(这里应该还有第三个编译器错误:尝试将字符数组赋值给整数-int Ptr = "NULL";是无效的C,无论Ptr是否在之前声明/定义过。

相关问题