在codeblocks环境下的数组越界问题

C++语言 码拜 9年前 (2016-05-24) 1498次浏览
写了这样一个代码
讲道理的话,a[3]就应该越界了,原因是a[3]只创建了a[0],a[1],a[2]的空间
但是在codeblocks环境下有些奇怪的是,本人并没有给a[3]赋值啊,居然还能输出a[3]=3
根据调试的情况来看,a[3]的值一直跟着i的值在变化,最后被偷偷赋给了a[3]
哪位高手能给个解释啊? 为啥codeblocks要选择这么做

#include <iostream>
using namespace std;
int main()
{
    int a[3]={0,1,2};
    for(int i=0;i<3;i++)
    {
        cout<<a[i]<<endl;
    }
    cout<<a[3]<<endl;
    cout<<a[4]<<endl;
    return 0;
}

在codeblocks环境下的数组越界问题

解决方案

10

仅供参考:#include <time.h>
#include <stdlib.h>
#include <windows.h>
int main() {
int a,b[11];//本来是b[10],为判断哪句越界,故意声明为b[11]
srand((unsigned int)time(NULL));//按两次F11,等黄色右箭头指向本行时,调试、新建断点、新建数据断点,地址:&b[10],字节计数:4,确定。
while (1) {//按F5,会停在下面某句,此时a的值为10,b[10]已经被修改为对应0..4之一。
b[(a=rand()%11)]=0;
Sleep(100);
b[(a=rand()%11)]=1;
Sleep(100);
b[(a=rand()%11)]=2;
Sleep(100);
b[(a=rand()%11)]=3;
Sleep(100);
b[(a=rand()%11)]=4;
Sleep(100);
}
return 0;
}

10

#include <time.h>
#include <stdlib.h>
#include <windows.h>
int main() {
    int a,b[11];//本来是b[10],为判断哪句越界,故意声明为b[11]
    srand((unsigned int)time(NULL));//按两次F11,等黄色右箭头指向本行时,调试、新建断点、新建数据断点,地址:&b[10],字节计数:4,确定。
    while (1) {//按F5,会停在下面某句,此时a的值为10,b[10]已经被修改为对应0..4之一。
        b[(a=rand()%11)]=0;
        Sleep(100);
        b[(a=rand()%11)]=1;
        Sleep(100);
        b[(a=rand()%11)]=2;
        Sleep(100);
        b[(a=rand()%11)]=3;
        Sleep(100);
        b[(a=rand()%11)]=4;
        Sleep(100);
    }
    return 0;
}

10

这类情况本人猜测是 i 的内存恰好在a内存的后面
所以同为 int,正好宽度跟数组元素一样,a[3] 取得的值就是 i 内存的值。
越界取值不可预测,只是你这种恰巧编译器是这么分配内存的,代码是这样子的!

20

打印下i的地址和a[3]的地址吧

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明在codeblocks环境下的数组越界问题
喜欢 (0)
[1034331897@qq.com]
分享 (0)