当我试图初始化一个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;
}
型
有人能解释一下那里的情况吗?
1条答案
按热度按时间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
是否在之前声明/定义过。