Jay*_*esh 2 c arrays global-variables extern
如果我将数组声明为像这样的全局:
#include <stdio.h>
char arr[];
int main()
{
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译器生成警告:
test.c:3:6: warning: array ‘arr’ assumed to have one element [enabled by default]
char arr[];
Run Code Online (Sandbox Code Playgroud)
但是,如果我将数组声明为全局显式提供extern关键字,如下所示:
extern char arr[];
int main()
{
return 0;
}
Run Code Online (Sandbox Code Playgroud)
然后,它没有警告就编译好了.
但是,默认情况下全局变量是extern,为什么第一种情况会产生警告呢?
第一种情况需要在运行时为未指定长度的数组分配内存.这很"难",这就是编译器通过假设长度为1来抱怨和欺骗的原因.
第二种情况只需要其他人为数组提供基地址,并且确保在提供的位置分配内存是有问题的.
不完全确定细节如何着陆,但这是两者之间的基本区别.
C11草案甚至将此作为一个明确的例子:
extern int *x;
extern int y[];第一个声明
x是指向int; 第二个声明y是一个int未指定大小的数组(不完整类型),其存储在其他地方定义.
当你写一个
char arr[];
Run Code Online (Sandbox Code Playgroud)
在全局范围内,您的目的是定义具有静态生命周期的数组.因此,您必须指定它包含的元素数量.
当你写作
extern char arr[];
Run Code Online (Sandbox Code Playgroud)
它只是一个声明,告诉编译器一个名为array的数组arr存在于其他地方,这里没有定义.因此不需要尺寸.