全局和函数中的不同初始值和符号指针值

时间:2014-01-26 10:34:46

标签: c gcc compiler-construction

我知道我会在这个问题上得到很多评分,但我仍然会写下以下测试代码:

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
  • 之间的区别

请根据编译器视图给我提出以上三个问题的建议(或者您认为在编码标准等其他视图中应该有其他解释?)

2 个答案:

答案 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;行缺少分号。