为啥这个 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 程序会崩溃?它编译得很好[重复]的主要内容,如果未能解决你的问题,请参考以下文章