【C语言】-- 死循环了怎么办?

#include <stdio.h>
int main()
{
    int i = 0;
    int arr[] = {1,2,3,4,5,6,7,8,9,10};
    for(i=0; i<=12; i++)
    {
        arr[i] = 0;
        printf("hello\n");
    }
    return 0;
}

阅读上面这个代码,我们会认为这不就是简单的数组访问越界么。那么这段代码就应该会报错,接下来我用VS进行运行,看结果真是这样吗?

VS 32位

VS 64位

 由上面可知,这段代码在VS上不同位操作系统的结果是不一样的,并不都会报错。原因是这与地址在内存中是如何开辟的有关。

32位内存开辟是由高地址向低地址的,由于 int i = 0 先于 数组arr 创建,故变量i的地址是高于数组arr的地址的。又由于一个数组其内部又是从低地址到高地址存储的。故数组内越往后存储,其地址就越高。此代码的a[12]恰巧指向i的地址,使i又被变为0,因此一直死循环。

64位内存开辟都是低地址向高地址的,所以会发生数组越界。

下面是VS中调试查看内存的步骤,能熟练调试,对于一些代码问题是非常有帮助的。因此代码遇到问题不要慌,先调试看看。

猜你喜欢

转载自blog.csdn.net/m0_73381672/article/details/131315650
今日推荐