我正在从K & R做练习,这需要我对主函数提供的数组中的行进行排序。我这样宣布一个数组:char line[MAXLINES * MAXLEN]
,其中MAXLINES
和MAXLEN
分别是常数5000
和1000
。我在主函数中声明了这一点。显然这只是使程序崩溃。我在Windows 10,64位上使用适用于x86的Microsoft(R)C/C++优化编译器版本19.00.23506。但是,当我使用static关键字声明数组时,像这样:static char line[MAXLINES * MAXLEN]
,它工作。根据我所了解的关于static关键字的知识,当它应用于内部变量时,它提供了函数内的永久存储。但是从static关键字的定义中,我不清楚为什么没有使用static关键字声明的字符数组会崩溃。请注意,如果没有static关键字,则较小大小的数组可以正常工作。数组的大小是否有限制?字符数组声明没有静态关键字在C中崩溃
1
A
回答
2
这个数组的大小是多少?
C标准没有固定的限制,但由于内存不是无限的,所以总是有实际的限制。对于本地变量,实际限制通常比全局或静态或动态分配的内存少。
函数的局部变量和参数在内存位置上创建,称为call stack。调用堆栈的实现方式依赖于平台/架构/编译器,但通常不能存储大量的数据。当你声明一个变量static时,它不会被存储在栈内存中。
现在,由于5000 * 1000 = 5000000
是大量数据,因此系统上的堆栈无法保存,从而导致崩溃。由于static
存储在不同的位置,因此您可以在不使程序崩溃的情况下创建它。其中静态变量存储在准确
更多细节可以在这太问题可以找到:Where are static variables stored (in C/C++)?
编辑:作为评论指出,这个调用堆栈是不是从C语言的要求,即C不强制实施使用调用堆栈。这是一个实施问题。虽然调用堆栈在实现中很常见,但可能存在以不同方式处理内存的系统。
相关问题
- 1. 在C++中声明大字符数组
- 2. 如何在Java中声明静态字符串数组?
- 3. 函数声明__constructor中没有关键字public在PHP中
- 4. NUL字符和静态字符数组/字符串在C
- 5. 关于字符串数组声明
- 6. c中的静态关键字#
- 7. 声明2d字符数组?
- 8. 声明静态私有数组成员
- 9. 硒 - 声明列表中存在多个关键字的数组
- 10. 应该用C中的文字初始化具有指定大小的静态声明字符数组吗?
- 11. 在java中声明关键字
- 12. 字符串没有在条件声明?
- 13. JSP声明中的静态字段
- 14. 声明指针数组字符数组
- 15. 在C中声明二维数组的字符串与整数?
- 16. 为什么不能在类中声明const静态字符串
- 17. PHP 5.3静态关键字
- 18. 如何在Java中声明动态字符串数组
- 19. “where”关键字在c sharp中的类声明中
- 20. C++ Dll字符串函数崩溃
- 21. 无符号字符的数组声明
- 22. 如何在C++中声明一个字符串数组?
- 23. F#中有没有C#的@关键字?
- 24. 类声明中的关键字const
- 25. 代码崩溃。试图从字符数组中删除字符C
- 26. 在c#属性声明中的“新”关键字
- 27. 在C++中声明字符串为std:string
- 28. C++字符串声明
- 29. 关于带关键字的静态关键字的问题
- 30. 正向声明静态函数C++
C语言中没有堆栈。 – Olaf
@Olaf你是什么意思?为了澄清,我正在谈论调用堆栈。 – taskinoor
我知道oyu的意思。没有要求实现使用特定的结构来存储自动或静态变量。例如,有些实现不使用堆栈。 – Olaf