【C语言初阶】八、调试与数据的存储

一、

先看代码

#include 

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

此代码是一个死循环

原因:

 1.函数的调用会创建栈帧,这个空间是在栈区开辟的;

2.栈区的使用是先使用高地址处的空间,再使用低地址出的空间;

3.数组随着下标的增长,地址是由低到高变化的;

4.由函数栈帧创建的机制可知,变量  i  和 arr[9] 之间正好空着两个整形的位置;

5.所以  arr[12]  指向的是  i  所在空间;

6.当循环到  i=12  时, arr[i]  此时指向i的地址,又将i的值改为0了。所以此代码是死循环。

注:

a、但此代码是以来环境的,此效果是在VS2013环境下测试。

b、在VC6.0中  i  和 arr 数组中间没有空

c、在gcc中  i  和arr 数组中空出一个int空间

d、此代码经过Release优化后不会死循环,优化方式是让  i  和 arr 的内存布局发生了改变。

二、const修饰指针

const 放在  *  的左边,此时修饰的是 *p ,即,不能通过 p 来改变 p 指向的对象;

const 放在  *  的右边,此时修饰的是 p ,即,不能改变p的指向;

你可能感兴趣的:(c语言,算法,c++)