为啥这个 C 程序会崩溃?它编译得很好[重复]

Posted

技术标签:

【中文标题】为啥这个 C 程序会崩溃?它编译得很好[重复]【英文标题】: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,而不是您。我们的信息相互交叉。 在构建时,它也可以帮助阅读警告消息,如果您的代码没有收到警告消息,则提高级别以获得更多警告。 【参考方案1】:
scanf ("%i", &arrayMax);

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

【讨论】:

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

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

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

【讨论】:

【参考方案3】:

scanf 是 variadic function。

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

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

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

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

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

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

【讨论】:

以上是关于为啥这个 C 程序会崩溃?它编译得很好[重复]的主要内容,如果未能解决你的问题,请参考以下文章

编译代码后它崩溃(不明白为啥)

我的 min 和 max nextInt 有错误 [重复]

C程序为啥会崩溃?

重复符号链接器错误(C++ 帮助)

我的应用程序不断崩溃,大概是因为空对象引用错误,但我不知道为啥

Java中的静态块[重复]