【问题标题】:Character array declared without static keyword crashes in C没有静态关键字声明的字符数组在 C 中崩溃
【发布时间】:2017-04-23 11:31:37
【问题描述】:

我在 K & R 中做一个练习,要求我对 main 函数提供的数组中的行进行排序。我声明了一个这样的数组:char line[MAXLINES * MAXLEN],其中MAXLINESMAXLEN 分别是常量50001000。我在主函数中声明了这一点。显然这只会使程序崩溃。我在 Windows 10、64 位上使用 Microsoft (R) C/C++ Optimizing Compiler Version 19.00.23506 for x86。但是,当我使用 static 关键字声明数组时,就像这样:static char line[MAXLINES * MAXLEN],它可以工作。根据我对 static 关键字的了解,当应用于内部变量时,它会在函数中提供永久存储。但是从 static 关键字的定义来看,我不清楚为什么在没有 static 关键字的情况下声明的字符数组会崩溃。请注意,如果没有 static 关键字,较小的数组也可以正常工作。数组的大小是否有限制?

【问题讨论】:

    标签: c arrays static


    【解决方案1】:

    数组的大小是否有限制?

    C 标准没有设定固定的限制,但由于内存不是无限的,所以总有一个实际的限制。而且这个实际限制通常对于局部变量比全局或静态或动态分配的内存要少得多。

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

    现在由于5000 * 1000 = 5000000 是大量数据,您系统上的堆栈无法容纳它,从而导致崩溃。由于static 存储在单独的位置,因此您可以创建它而不会导致程序崩溃。

    有关静态变量的确切存储位置的更多详细信息可以在这个 SO 问题中找到:Where are static variables stored (in C/C++)?

    编辑:正如评论中所指出的,此调用堆栈不是 C 语言的要求,即 C 不强制实现使用调用堆栈。这是一个执行问题。尽管调用堆栈在实现中很常见,但可能会有一些系统以不同方式处理内存。

    【讨论】:

    • C语言中没有栈。
    • @Olaf 你是什么意思?澄清一下,我说的是调用堆栈。
    • 我知道 oyu 的意思。实现不需要使用特定结构来存储自动或静态变量。例如,有些实现不使用堆栈。
    • @Olaf 感谢您的澄清。是的,我也明白你的意思。编辑答案以明确这一点。
    • 注意到了一些东西(在某些系统或操作系统/编译器中可能是独一无二的 - 我不知道),但我在寡妇 10 64 位上使用 Visual Studio,如果我不使用静态声明一个 char 数组,如果我操作该数组并将其返回到函数之外,它会显示“垃圾”。这似乎与数组大小无关,因为我只有一个 9 char 字符串(8 + 终止符。似乎 static 关键字确保分配的内存空间仍然可用,并且不会在函数外部的某个点以某种方式被覆盖。看起来像我别无选择,只能使用静态声明数组
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-25
    • 2014-10-08
    • 1970-01-01
    • 2012-04-06
    • 1970-01-01
    • 1970-01-01
    • 2015-07-29
    相关资源
    最近更新 更多