如果下标超过了C中数组的大小,那么给数组赋值时会发生什么情况

如果下标超过了C中数组的大小,那么给数组赋值时会发生什么情况,c,C,如果下标超过了C中数组的大小,给数组赋值时会发生什么 在其他语言中,它抛出异常,C是否也抛出异常?由于某种原因,我没有得到任何错误 如果下标超过了C中数组的大小,给数组赋值时会发生什么 坏事发生了。或者不是。事实上,标准规定这是未定义的行为,这意味着任何事情都可能发生 在其他语言中,它抛出异常,C是否也抛出异常 否。未定义。这意味着您可能会覆盖的另一个变量,如果您不幸什么也不做 有一些很好的答案,可能值得一看 C也没有异常,这意味着它不能抛出异常。这在很大程度上取决于程序、编译器和系统。Wind

如果下标超过了C中数组的大小,给数组赋值时会发生什么

在其他语言中,它抛出异常,C是否也抛出异常?由于某种原因,我没有得到任何错误

如果下标超过了C中数组的大小,给数组赋值时会发生什么

坏事发生了。或者不是。事实上,标准规定这是未定义的行为,这意味着任何事情都可能发生

在其他语言中,它抛出异常,C是否也抛出异常


否。

未定义。这意味着您可能会覆盖的另一个变量,如果您不幸什么也不做

有一些很好的答案,可能值得一看


C也没有异常,这意味着它不能抛出异常。

这在很大程度上取决于程序、编译器和系统。Windows通常对越界内存要求更严格,而Linux可以给您一些额外的空间,这可以使程序正常工作(即使有问题)

如果幸运的话,系统将立即崩溃,您会在错误出现的那一刻注意到它。如果你运气不好,这将改变一个完全出乎意料的(但从程序的角度来看是正确的)变量,并将在代码中与导致问题的部分完全不同的部分上创建奇怪的bug。这些可能是计算机上最严重的错误

在Linux系统中,一个很好的工具是,它将检查此类问题(以及其他问题)。不幸的是,我不知道Windows上有什么等效的工具…:-(


C无法抛出异常,因此…

写入数组末尾意味着您正在写入另一位内存。发生的情况取决于计算机当时对该内存所做的操作

如果内存属于另一个程序,则可能会出现异常或程序崩溃。
如果你拥有内存,你会改变这个值。可能是一个循环计数器,你会得到一个无限循环。可能是你要写的硬盘上的地址,你会把文件系统弄糟。可能它被忽略了,什么也不会发生

所以“会发生什么?”的答案是“几乎什么都有,包括‘什么都没有’”


在现代编程中,缓冲区溢出是没有借口的。不要这样做。

行为是未定义的;任何(对于“任何”的合理值)可能发生。您的程序可能看起来工作正常,您可能损坏某些内存,导致程序执行后期出现问题,您可能触发分段冲突,或者可能发生其他情况。缓冲区溢出是恶意软件的常见漏洞。

C没有例外,因此第二个问题是……嗯,在Windows one中自行回答可以使用IBM Rational Purify。它可以检测这样的内存覆盖。使用算法时,您需要严格的逻辑,但这种类型的错误[“C上最严重的错误”]将您的信念返回到非理性。C没有异常,但操作系统有异常。在C中取消对错误指针的引用,您将得到异常。@Michael,这是操作系统的详细信息,与C无关。Windows会引发状态访问冲突,类unix操作系统会发送SIGSEGV信号。我的观点是,您的C程序可能会引发异常。Although异常不是C语言的一部分,C程序必须在真实的操作系统上运行。最初的声明“C也没有异常,这意味着它不能抛出它们”可能会产生误导。@Michael我同意操作系统可能决定终止进程,但我的立场是关于C(没有例外)而不是底层操作系统(未知)。海报可能想说的是“我会遇到错误吗?”答案当然是“可能”,因为它可能不会尝试写入只读内存。如果您写入的内存属于另一个进程,则大多数系统中都会出现异常。