我知道我会在这个问题上得到很多评分,但我仍然会写下以下测试代码:
int *gPtr;
//I know I can NOT write below code line, but I need know WHY
gPtr = NULL;//or some other value which I want to init it
//int *gPtr = NULL; //this line should be OK
int main (void)
{
int *ptr;
ptr = NULL;
return 0;
}
编译期间的全局*gPtr
将输出错误:
ptr.c:4:1: warning: data definition has no type or storage class [enabled by default]
ptr.c:4:1: error: conflicting types for ‘gPtr’
ptr.c:3:6: note: previous declaration of ‘gPtr’ was here
ptr.c:4:8: warning: initialization makes integer from pointer without a cast [enabled by default]
但是,在函数中,我做了相同的代码,但没有编译错误/警告,我想知道:
int a = 0;
和int a; a=0;//no other code between these two sentences
请根据编译器视图给我提出以上三个问题的建议(或者您认为在编码标准等其他视图中应该有其他解释?)
答案 0 :(得分:4)
您可以使用初始值定义全局变量:
int *gPtr = NULL;
但是你不能在函数范围之外执行 。 编译器(好吧,至少我的clang编译器)实际上解释了
gPtr = NULL;
在全球范围内
int gPtr = NULL;
导致类似警告和冲突类型错误:
warning: type specifier missing, defaults to 'int' [-Wimplicit-int] gPtr = NULL; ^~~~ error: redefinition of 'gPtr' with a different type: 'int' vs 'int *' note: previous definition is here int *gPtr;
自动初始化没有显式初始值的全局变量 为零,因此在你的情况下
int *gPtr;
就足够了(正如@WhozCraig上面已经评论过的那样)。
答案 1 :(得分:0)
编译好:
#include <stdio.h>
/* int *gPtr; */
/* gPtr = NULL; */
int *gPtr = NULL;
int main (void)
{
int *ptr;
ptr = NULL;
return 0;
}
我怀疑你有两个问题之一。首先,您不能声明gptr
,然后为其指定NULL,然后然后执行int *gptr = NULL
(前两个合并);因此我评论了前两个。你需要一个或另一个。其次,您的第int *gPtr = NULL;
行缺少分号。