数组越界

来源:百度知道 编辑:UC知道 时间:2024/05/27 00:53:40
# include<stdio.h>
main()
{ int a[2],i,j;
a[4]=43;
printf("%d",a[4]);
}
只定义了数组a[2] 为什么程序还能运行 没有越界吗
是不是也就是 用a[4] 是占用了别的程序或空闲的内存

语法错误不等于不能执行,能执行不等于结果正确....

结论:
越界是肯定的
内存是很大的

举个例子吧:
int main(...){
int a =0;
int b[3] = 0;

b[3] = 1;
}

//结果有可能使a=1;
//具体结果跟进程中栈排列有关

越界虽然会影响其它内存位置的变量,但只能影响本进程空间的内存,对其他程序没有影响,除非你的越界已经延伸到了环境变量的位置

unix/linux下可能的错误(其他的不知道):
SIGBUS 总线错误
SIGSEGV 段地址错误

任何的变量只是内存的一种表示而已,你定义了数组int a[2]表示你申请了4字节连续的内存空间,a就代表其首地址,这片内存不会被别的程序使用,只有你的程序会使用它存取数据;a[4〕虽然没有定义,但是这个内存空间是存在的,就是a+4,这片空间可能是被别的程序使用了,也可能是闲置着的,你不一定无权访问,但是你如果访问了很有可能会得不到你想要的结果,甚至会影响系统的运行,很有危险的!!

是啊!!

当然有越界了,但是C语言标准规定访问比数组大小大1的地址是合法的,有的实现甚至允许访问更多的地址,但错误就像楼上所说的那样

有越界,
不一定表现出来,
未知错误,
会修改其他地方内存
很危险。

定义的a[2];只有两个数组元素,所以只能访问a[0]和a[1]
而后面访问a[4],是非法的。