关于linux越界访问的问题,很不理解
例如啊:
struct test
{
int a;
int b;
};
int main()
{
struct test a[10];
a.[20].b = 10;
printf("%d\n",a[20].b);
return 0;
}
这段代码是正确的,运行时居然还对了,很少不理解啊?求高手解释
我还发现一个内核有这么定义的
struct test a[0];
这个定义的意图是什么啊?再次求解释
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
可运行不代表正确。
零长数组,取址方便。
本帖最后由 Horizon2012 于 2011-05-29 16:41 编辑
a[10]分配在栈中,栈由高往低生长,而a[20].b=10 这样做已经侵犯了已分配栈的较高地址空间
不管是往上走还是往下走,只要在一页之内,硬件不会产生异常,OS也就不会管你。这必需由硬件本例,不然,每一次访问内存还去先检查地址是不是正确的。
同意三楼
能运行并不代表正确,合理
就是
linux分配内存有一个padding的,你虽然访问了数组外的内存,但这个内存还在这一页的padding内,不会越界
0长数组还是很有玄机的~~
太深奥了!学习中!