Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 如果初始化未指定大小的数组,为什么会显示编译器错误?_Arrays_C_Initialization - Fatal编程技术网

Arrays 如果初始化未指定大小的数组,为什么会显示编译器错误?

Arrays 如果初始化未指定大小的数组,为什么会显示编译器错误?,arrays,c,initialization,Arrays,C,Initialization,如果我之前没有指定数组的大小并尝试初始化它,为什么会显示编译器错误 intmain() { int-ar[]={}; int n=5; 对于(int i=0;i

如果我之前没有指定数组的大小并尝试初始化它,为什么会显示编译器错误

intmain()
{
int-ar[]={};
int n=5;
对于(int i=0;i
来自
C11
,第6.7.6.2章

除了可选的类型限定符和关键字
static
[
]
可以限定表达式或
*
。如果它们限定表达式(指定数组大小),则表达式应为整数类型。如果表达式是常数表达式,则其值应大于零。元件类型不得为不完整或功能类型。可选类型限定符和关键字
static
应仅出现在具有数组类型的函数参数声明中,然后仅出现在最外层的数组类型派生中

所以,这个语法

int ar[] = {};
是违反约束的行为。如果启用基本编译器警告,您应该看到如下内容

In function ‘main’:
error: ISO C forbids empty initializer braces [-Werror=pedantic]
     int ar[] = {};
                ^
error: zero or negative size array ‘ar’
     int ar[] = {};
要回答为什么会出现编译器错误,考虑一下程序使用的内存结构可能会很有用

当程序执行问题中引用的函数时,它会向堆栈中添加一个帧

“添加帧”只是指将当前函数的信息添加到堆栈的末尾,当程序运行代码时,它还需要为数组创建空间

对我来说,给定的语法只能表示一个动态大小的数组,这意味着可以通过调整结构的大小来任意添加或删除项

这样做的问题是数组存储在堆栈上,由于通常在函数框架中的函数变量之后添加了内容,因此没有空间向数组添加更多的项目


因此,C似乎会通过允许这种使用而产生许多问题,并且为数组指定一个大小会允许程序使用堆栈中的空间量,这在运行时不会导致堆栈内存问题。

您正在该行中声明并初始化一个:

int ar[] = {};

零长度数组的使用很少(例如,为了对齐目的,使用尾部填充结构),而且您的代码看起来不像是要使用它,因此您这样做可能是偶然的。

您没有与数组关联的大小。它应该如何知道分配多少内存<代码>int ar[]={}这不可编译!你的编译器应该告诉你这一点,但它确实会编译,即使没有警告,也会分配一个零大小的数组,并且在第一次操作中尝试设置第一个元素,这会导致UB。在我使用GCC的机器上,它将
n
的值修改为
i+1
,然后在一次迭代后结束循环。但它也可能因segfault而崩溃。@JanChristofterasa如果您的编译器设置丢失,请添加它们以捕获问题并获得一致的代码。这在为GCC设置
-pedantic
时发生,但对
-Wall
-Wextra
都不会发生。