【问题标题】:Why does my C code crash? [closed]为什么我的 C 代码会崩溃? [关闭]
【发布时间】:2018-02-12 19:18:16
【问题描述】:

我正在尝试 C 中的语法,因为它对我来说是新的。我刚从数组、循环和随机数开始,所以我写了这个非常简单的测试代码:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main() {
    srand(time(NULL));
    int arr[9];

    for(int i=0; i<10; i++) {
        arr[i] = rand();
        printf("%d \n", arr[i]);
    }
}

我用 gcc 编译它并从命令提示符运行。运行良好,打印数组中的每个元素......然后崩溃。为什么?代码逻辑有问题吗?

提前感谢您!这是我在这里的第一个问题,所以如果我在提问规则中犯了任何错误,我提前道歉。

【问题讨论】:

  • i &lt; 10 ---> i &lt; 9
  • 该数组包含9 个元素。您正在访问10
  • 访问数组越界使程序行为错误(调用未定义的行为)。程序崩溃就是其中之一。
  • @JR C 中的一般规则:如果你非常非常幸运,编译器会发现你的错误。如果你只是幸运的话,你的错误会使程序崩溃。但如果你不走运,你的错误会悄悄地破坏其他地方的数据,或者导致程序稍后出现不可预测的行为。
  • 还有,我怕你拿不到‘本月原创书名’奖:(

标签: c arrays loops random


【解决方案1】:

您正在访问超出数组限制的内存,而您无权访问,这会导致未定义的行为。您这样做是因为您有一个包含 9 个元素的数组,但您尝试访问 10 个。要纠正,您应该编写:

// ...
for(int i = 0; i < 9; i++) {
    // ...
}

【讨论】:

  • 谢谢,我已经解决了这个问题,但如果我使用更高的数字,它仍然会崩溃。例如,这也会崩溃:https://pastebin.com/GYUKnQW2
  • @JR 每个问题站点一个问题。
  • @EugeneSh。原来如此。谢谢你。我将不得不等到邮政计数器重置,然后再询问。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
相关资源
最近更新 更多