为什么静态数组越界可以正常访问?

时间:2021-05-31 19:30:27
我创建了一个静态数组,越界访问为什么不报错(VS2010)
static int arr[10] = {0};
arr[11] = 1;
可以正常输出

16 个解决方案

#1


行为未定义,怎么样都有可能。

#2


其实电脑开机后物理内存的每个字节都是可读写的,区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。

操作系统内存管理的粒度不是字节而是页,一页通常为4KB

#3



那是编译器骗了你,结果是不可欲知的!

但是一点, 这样的代码显然是不对!

#4


引用 3 楼 max_min_ 的回复:
那是编译器骗了你,结果是不可欲知的!

但是一点, 这样的代码显然是不对!

回答正确。

#5


静态变量在程序的数据段分配,是一片连续的空间,超出范围的访问可能会摧毁你别的变量,比如,arr[11]处恰好是程序的一个指针,那你的程序就完蛋了

#6


这样的空间是在栈里面,c与c++对越界是不进行检查的,当程序越界时结果很危险,可能修改了别的程序或者自己程序的内容,若越界的地方是不可访问的,或者只读,程序对其修改就会出现运行时异常

#7


越界访问,系统是不管你的。如果赶对了,越界访问也是能够读写的,只是读出的内容不是你所需要的。如果运气不好,访问的内容可能会导致程序异常崩溃,所以访问越界是软件比较难查的一类BUg,通常是手误造成的。

#8


这有设么的,当然可以访问。请深入理解计算机原理

#9


原理上,内存的每个单元都是可访问的,只是OS有个内存管理模块,它会对访问进行监控。
静态变量和全局变量都是分配在程序独立地址空间中的全局数据区,这个区域是一个连续的区域。
编译器没有报错……这个……但是,如果运行起来,越界修改的那个单元的数据就会损失。
我用VC++6.0 和 VS2010 测试了一下不论是 static 还是普通数组,编译都不报错:
static int Arry[10];
int Arry2[10];
int main()
{
  Arry[1000]=1;
  Arry2[100]=2;
  return 0;
}
当然我不敢运行这程序

#10


各位兄弟千万不要运行楼上的程序,否则全中国的网络将瘫痪

#11


引用 10 楼 audi2 的回复:
各位兄弟千万不要运行楼上的程序,否则全中国的网络将瘫痪


写这个程序的目的,是解答LZ的疑问,也没有叫你运行,还提醒了别运行。
即使运行,又为什么全中国网络会瘫痪?你这也太看得起我的能耐了吧, 顶多也就你的机子跪了……

#12


楼主,您中奖了。
难得赵老师给出这么细粒度的答案。

引用 2 楼 zhao4zhong1 的回复:
其实电脑开机后物理内存的每个字节都是可读写的,区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。

操作系统内存管理的粒度不是字节而是页,一页通常为4KB

#13


假如 越界了 立刻崩溃了 你应该高兴,
没有崩溃 那你就有可能遇到莫名其名的问题,然后崩溃。。你很难定位。。
栈空间已经被破坏了。。

#14


错了 static不是栈里。。

#15


不是静态的数组越界也是能访问的,只不过指向的数据不确定而已。

#16


引用 11 楼 cjfdqchwh 的回复:
Quote: 引用 10 楼 audi2 的回复:

各位兄弟千万不要运行楼上的程序,否则全中国的网络将瘫痪


写这个程序的目的,是解答LZ的疑问,也没有叫你运行,还提醒了别运行。
即使运行,又为什么全中国网络会瘫痪?你这也太看得起我的能耐了吧, 顶多也就你的机子跪了……

这是幽默吧....好吧大概我笑点低..

#1


行为未定义,怎么样都有可能。

#2


其实电脑开机后物理内存的每个字节都是可读写的,区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。

操作系统内存管理的粒度不是字节而是页,一页通常为4KB

#3



那是编译器骗了你,结果是不可欲知的!

但是一点, 这样的代码显然是不对!

#4


引用 3 楼 max_min_ 的回复:
那是编译器骗了你,结果是不可欲知的!

但是一点, 这样的代码显然是不对!

回答正确。

#5


静态变量在程序的数据段分配,是一片连续的空间,超出范围的访问可能会摧毁你别的变量,比如,arr[11]处恰好是程序的一个指针,那你的程序就完蛋了

#6


这样的空间是在栈里面,c与c++对越界是不进行检查的,当程序越界时结果很危险,可能修改了别的程序或者自己程序的内容,若越界的地方是不可访问的,或者只读,程序对其修改就会出现运行时异常

#7


越界访问,系统是不管你的。如果赶对了,越界访问也是能够读写的,只是读出的内容不是你所需要的。如果运气不好,访问的内容可能会导致程序异常崩溃,所以访问越界是软件比较难查的一类BUg,通常是手误造成的。

#8


这有设么的,当然可以访问。请深入理解计算机原理

#9


原理上,内存的每个单元都是可访问的,只是OS有个内存管理模块,它会对访问进行监控。
静态变量和全局变量都是分配在程序独立地址空间中的全局数据区,这个区域是一个连续的区域。
编译器没有报错……这个……但是,如果运行起来,越界修改的那个单元的数据就会损失。
我用VC++6.0 和 VS2010 测试了一下不论是 static 还是普通数组,编译都不报错:
static int Arry[10];
int Arry2[10];
int main()
{
  Arry[1000]=1;
  Arry2[100]=2;
  return 0;
}
当然我不敢运行这程序

#10


各位兄弟千万不要运行楼上的程序,否则全中国的网络将瘫痪

#11


引用 10 楼 audi2 的回复:
各位兄弟千万不要运行楼上的程序,否则全中国的网络将瘫痪


写这个程序的目的,是解答LZ的疑问,也没有叫你运行,还提醒了别运行。
即使运行,又为什么全中国网络会瘫痪?你这也太看得起我的能耐了吧, 顶多也就你的机子跪了……

#12


楼主,您中奖了。
难得赵老师给出这么细粒度的答案。

引用 2 楼 zhao4zhong1 的回复:
其实电脑开机后物理内存的每个字节都是可读写的,区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。

操作系统内存管理的粒度不是字节而是页,一页通常为4KB

#13


假如 越界了 立刻崩溃了 你应该高兴,
没有崩溃 那你就有可能遇到莫名其名的问题,然后崩溃。。你很难定位。。
栈空间已经被破坏了。。

#14


错了 static不是栈里。。

#15


不是静态的数组越界也是能访问的,只不过指向的数据不确定而已。

#16


引用 11 楼 cjfdqchwh 的回复:
Quote: 引用 10 楼 audi2 的回复:

各位兄弟千万不要运行楼上的程序,否则全中国的网络将瘫痪


写这个程序的目的,是解答LZ的疑问,也没有叫你运行,还提醒了别运行。
即使运行,又为什么全中国网络会瘫痪?你这也太看得起我的能耐了吧, 顶多也就你的机子跪了……

这是幽默吧....好吧大概我笑点低..