【问题标题】:Process terminated with status -1073741819 mid loop?进程以状态-1073741819 中间循环终止?
【发布时间】:2017-03-26 08:22:22
【问题描述】:

C 初学者并遇到初始化数组的函数的问题。在代码中编译:Windows 10 上的 Blocks 16.01。我遇到问题的具体代码是:

void initAuction(float auction[2][MAXAUCTIONITEMS]) {
    int i;

    for (i = 0; i < MAXAUCTIONITEMS; i++) {
        auction[1][i] = -1;
        printf("\n%f\t%d\n", auction[1][i], i);
    };
    for (i = 0; i < MAXAUCTIONITEMS; i++) {
        auction[2][i] = 0;
        printf("\n\n%f\t%d", auction[2][i], i);
    }
    printf("\n%f\n", auction[2][70]);
    return;
}

我已经设置了打印语句来查看在崩溃之前我已经走了多远,我进入了第二个 for 循环,但它在 i=140 时崩溃了。如果我更改常数(等于 1000),那么我可以将其设置为不会崩溃的最高值是 i

我试过在谷歌和这里搜索,似乎终止代码不是一个非常具体的代码,因为我已经看到了需要返回语句、尝试访问不存在的东西等的解决方案。真的丢了。

【问题讨论】:

  • float auction[2][MAXAUCTIONITEMS]:您的第一个维度的大小为 2,但您使用auction[2][i] 对拍卖进行索引,超出范围。请记住,C 是从 0 开始的。
  • 一般来说,你应该提交一个完整的程序来证明错误——例如包括一个main,它做最少的工作来显示错误。
  • 使用调试器解决这些问题。
  • @Evert,尝试使用调试器,在项目中打开它(因为 Code:Blocks 显然不支持调试单个源文件)并且实际上无法让 Code:Blocks 构建我的程序。它一直告诉我它想构建它,但每当我单击“是”时,它就会再次询问。
  • 未来提示:当您收到类似-1073741819 的奇怪十进制错误代码时,请将其转换为十六进制,在本例中为0xc0000005。这是 Windows 上可识别的状态代码,它是访问冲突错误(即访问无效的内存)。

标签: c


【解决方案1】:

您正在设置超出其边界的数组元素:auction 的初始维度是 2,此索引的唯一有效值是 0 和 1。

您可以通过这种方式修复和简化代码:

void initAuction(float auction[2][]) {
    for (int i = 0; i < MAXAUCTIONITEMS; i++) {
        auction[0][i] = -1;
        auction[1][i] = 0;
    }
}

注意第二个维度不是auction类型的一部分,编译器会忽略它。

【讨论】:

  • 感谢您的回复。我不完全确定你为什么工作(即使我更正了指​​数),但我现在正处于时间紧缩状态,但如果这不是问题的话,我肯定想在明天询问更多关于差异的信息。再次感谢你!
【解决方案2】:

有效的索引是auction[0][*] 和auction[1][*]。

【讨论】:

  • 所以我尝试了您的编辑,但它仍然在 140 处崩溃,但现在第二行中的随机索引似乎是 = 随机值而不是零。此外,其中一些索引现在也包含字母?
猜你喜欢
  • 1970-01-01
  • 2013-09-26
  • 2022-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-11
  • 1970-01-01
相关资源
最近更新 更多