我正在从K& K进行锻炼。 R,它要求我对main函数提供的数组中的行进行排序。我声明了一个这样的数组:char line[MAXLINES * MAXLEN]
,其中MAXLINES
和MAXLEN
分别是常量5000
和1000
。我在main函数中声明了这个。显然这只会使程序崩溃。我在Windows 10,64位上使用Microsoft(R)C / C ++优化编译器版本19.00.23506 for x86。但是,当我使用static关键字声明数组时,如:static char line[MAXLINES * MAXLEN]
,它可以工作。根据我对static关键字的了解,当应用于内部变量时,它在函数内提供永久存储。但是从static关键字的定义来看,我不清楚为什么没有static关键字声明的字符数组会崩溃。请注意,较小的数组在没有static关键字的情况下工作正常。数组的大小是否有限制?
答案 0 :(得分:2)
数组的大小是否有限制?
C标准没有设定固定限制,但由于存储器不是无限的,因此总是存在实际限制。对于局部变量,实际限制通常比全局或静态或动态分配的内存少。
在名为call stack的内存位置上创建函数的局部变量和参数。究竟如何实现调用堆栈依赖于平台/体系结构/编译器,但通常它不能存储非常大量的数据。声明变量static时,它不会存储在堆栈内存中。
由于5000 * 1000 = 5000000
是大量数据,因此系统上的堆栈无法容纳它,从而导致崩溃。由于static
存储在不同的位置,因此您可以在不破坏程序的情况下创建它。
有关确切静态变量存储位置的更多详细信息,请参阅此SO问题:Where are static variables stored (in C/C++)?
编辑:如注释中所指出的,此调用堆栈不是C语言的要求,即C不强制实现使用调用堆栈。这是一个实施问题。尽管调用堆栈在实现中很常见,但可能存在以不同方式处理内存的系统。