2017-04-23 57 views
1

我正在从K & R做练习,这需要我对主函数提供的数组中的行进行排序。我这样宣布一个数组:char line[MAXLINES * MAXLEN],其中MAXLINESMAXLEN分别是常数50001000。我在主函数中声明了这一点。显然这只是使程序崩溃。我在Windows 10,64位上使用适用于x86的Microsoft(R)C/C++优化编译器版本19.00.23506。但是,当我使用static关键字声明数组时,像这样:static char line[MAXLINES * MAXLEN],它工作。根据我所了解的关于static关键字的知识,当它应用于内部变量时,它提供了函数内的永久存储。但是从static关键字的定义中,我不清楚为什么没有使用static关键字声明的字符数组会崩溃。请注意,如果没有static关键字,则较小大小的数组可以正常工作。数组的大小是否有限制?字符数组声明没有静态关键字在C中崩溃

回答

2

这个数组的大小是多少?

C标准没有固定的限制,但由于内存不是无限的,所以总是有实际的限制。对于本地变量,实际限制通常比全局或静态或动态分配的内存少

函数的局部变量和参数在内存位置上创建,称为call stack。调用堆栈的实现方式依赖于平台/架构/编译器,但通常不能存储大量的数据。当你声明一个变量static时,它不会被存储在栈内存中。

现在,由于5000 * 1000 = 5000000是大量数据,因此系统上的堆栈无法保存,从而导致崩溃。由于static存储在不同的位置,因此您可以在不使程序崩溃的情况下创建它。其中静态变量存储在准确

更多细节可以在这太问题可以找到:Where are static variables stored (in C/C++)?

编辑:作为评论指出,这个调用堆栈是不是从C语言的要求,即C不强制实施使用调用堆栈。这是一个实施问题。虽然调用堆栈在实现中很常见,但可能存在以不同方式处理内存的系统。

+0

C语言中没有堆栈。 – Olaf

+0

@Olaf你是什么意思?为了澄清,我正在谈论调用堆栈。 – taskinoor

+2

我知道oyu的意思。没有要求实现使用特定的结构来存储自动或静态变量。例如,有些实现不使用堆栈。 – Olaf