c - 为什么数组索引越界时GDB会显示正常退出的状态?

标签 c linux ubuntu gdb

void main()
{
        int arr[3] = {1,2,3,4,5,6};
        for(int i=0;i<6;i++)
        {
                printf("arr is %d\n", arr[i]);
        }
}

这是 GDB 的输出:

Starting program: /home/mayank/practice/test1 
arr is 1
arr is 2
arr is 3
arr is -1192452352
arr is 1079472019
arr is 1431652464

[Inferior 1 (process 29328) exited normally]
(gdb) 

最佳答案

如果越界访问数组,则会出现未定义的行为。未定义的行为就是:未定义。可能什么都不会发生,或者你的程序可能会崩溃,这一切都取决于月亮是否在第七宫,或者著名的 nasal demons 。可能会打扰你。

在您的测试程序中,您只需读取分配的数组后面。通过对实际编译器和目标系统的一些了解,您可以解释到底发生了什么。在许多情况下,就像你的情况一样,除了打印奇怪的值之外,没有什么不好的事情发生。因此,应用程序愉快地退出。

只要您不指示 GDB 监视您的应用程序对数组外部的访问,GDB 就不会注意到这一点。

注意:某些编译器可以选择检测生成的代码以检查数组索引。

关于c - 为什么数组索引越界时GDB会显示正常退出的状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60147701/

相关文章:

c - 为什么我们要将一段代码放在大括号内?

C 动态增长数组

linux - 仅返回匹配模式之后的行部分

linux - 在现有驱动程序上使用自定义驱动程序

ruby - 使用主管运行 'bundle exec middleman server'

c - 如何在 Eclipse 中编写不同的 C 小程序,所有这些程序都有自己的 main()?

c - 如何处理别人的驱动程序的内存泄漏

ubuntu - OBS 流到 Ubuntu 上的 session

linux - 从Linux中的文件的第一行提取数字

linux - 如何授予用户对/var/www/app 中 www-dat 拥有的文件夹的读/写权限?