C中全局变量的行为

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,为什么第一种情况会产生警告呢?

unw*_*ind 8

第一种情况需要在运行时为未指定长度的数组分配内存.这很"难",这就是编译器通过假设长度为1来抱怨和欺骗的原因.

第二种情况只需要其他人为数组提供基地址,并且确保在提供的位置分配内存是有问题的.

不完全确定细节如何着陆,但这是两者之间的基本区别.

C11草案甚至将此作为一个明确的例子:

extern int *x;
extern int y[];

第一个声明x是指向int; 第二个声明y是一个int未指定大小的数组(不完整类型),其存储在其他地方定义.


lll*_*lll 5

当你写一个

char arr[];
Run Code Online (Sandbox Code Playgroud)

在全局范围内,您的目的是定义具有静态生命周期的数组.因此,您必须指定它包含的元素数量.

当你写作

extern char arr[];
Run Code Online (Sandbox Code Playgroud)

它只是一个声明,告诉编译器一个名为array的数组arr存在于其他地方,这里没有定义.因此不需要尺寸.