【问题标题】:Why does this C program crash? It compiled fine [duplicate]为什么这个 C 程序会崩溃?它编译得很好[重复]
【发布时间】:2014-12-15 15:45:28
【问题描述】:

这个程序编译得很好。当我输入一个数字时,它会在我身上崩溃。 name.exe has stopped working 但是为什么呢?

int main (void) {
    int arrayMax = 0;

    printf ("How many numbers will be entered?\n");
    scanf ("%i", arrayMax);

    int i;
    double userInput [arrayMax];

    return 0;
}

【问题讨论】:

  • 在 C 中,您的程序正确编译是完全不保证它也能正确运行! C 赋予你强大的力量,这意味着很容易做一些“错误”的事情。
  • 您是否建议“编译”程序也应该始终运行良好?也许 C 语言不适合你!
  • for 循环被注释掉,因为我试图弄清楚它为什么不起作用。我找不到确切的答案,所以我来到这里。
  • @Carpetsmoker > 当然,我上面的评论是针对 OP,而不是您。我们的信息相互交叉。
  • 在构建时,它也可以帮助阅读警告消息,如果您的代码没有收到警告消息,则提高级别以获得更多警告。

标签: c arrays


【解决方案1】:
scanf ("%i", &arrayMax);

使用& 对地址执行此扫描。您需要传递需要将值扫描到的变量的地址。在这种情况下,您的变量是 arrayMax 并且您需要传递 scanf() 期望的此变量的地址,在这种情况下您没有这样做并且传递 0 这不是您想要扫描您的值的内存位置所以你看到崩溃。 写入无效内存位置会导致崩溃。

【讨论】:

  • 这将有助于告诉 OP为什么这可以解决问题,以及为什么关闭 & 会导致崩溃。
【解决方案2】:

您忘记将 & 运算符放在 scanf 参数中。

scanf ("%i", &arrayMax);  
          // ^Place unary & to specify the location.

【讨论】:

    【解决方案3】:

    scanfvariadic function

    因此,编译器无法确定传递给它的每个参数的类型是否正确(除了第一个参数的类型,它显式声明为const char*)。

    因此,决策从编译时“移至”运行时,因此您可能会得到运行时错误,而不是编译时错误。

    例如,在scanf("%i") 的情况下,函数需要int 变量的地址。

    在您的代码中,您传递的值是 0,因此scanf 将首先扫描用户输入,然后尝试将其写入该内存地址。

    如果包含此地址的内存段没有写入访问权限(例如,如果您的程序的代码段驻留在该地址),则此尝试将导致内存运行时访问冲突。

    您可以通过将scanf("%i",arrayMax) 更改为scanf("%i",&arrayMax) 来使其正常工作。

    【讨论】:

      猜你喜欢
      • 2015-08-21
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-01
      相关资源
      最近更新 更多