写了这样一个代码
讲道理的话,a[3]就应该越界了,原因是a[3]只创建了a[0],a[1],a[2]的空间
但是在codeblocks环境下有些奇怪的是,本人并没有给a[3]赋值啊,居然还能输出a[3]=3
根据调试的情况来看,a[3]的值一直跟着i的值在变化,最后被偷偷赋给了a[3]
哪位高手能给个解释啊? 为啥codeblocks要选择这么做
讲道理的话,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; }
解决方案
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;
}
#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 内存的值。
越界取值不可预测,只是你这种恰巧编译器是这么分配内存的,代码是这样子的!
所以同为 int,正好宽度跟数组元素一样,a[3] 取得的值就是 i 内存的值。
越界取值不可预测,只是你这种恰巧编译器是这么分配内存的,代码是这样子的!
20
打印下i的地址和a[3]的地址吧