指针越界访问和数组越界访问有什么区别?

gamelearner 2005-10-28 10:10:22
void main()
{
int a[1];
a[2] = 2; // ok!
int* p = a;
*(p+2) = 2; // error!
}

为什么有这样的不同!
...全文
299 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
wohow 2005-10-28
  • 打赏
  • 举报
回复
楼上不对吧?
int b;
int a[1];
a[2]就是b?
漂流的代码 2005-10-28
  • 打赏
  • 举报
回复
实际上
void main()
{
int a[1];
a[2] = 2; // ok!
}
也会出错
但是
void main()
{
int b;
int a[1];
a[2] = 2; // ok!
}

不会出错
对于出错的那个,
a[2]=2被编译成
mov dword ptr[ebp],2
ebp是堆栈的指针
出错的语句是
mov dword ptr [mainret],eax
显然,语句mov dword ptr[ebp],2破坏了原来堆栈的数据结构,
可能是由于ebp指向了mainret的地址.
对于第二个就没有错,这是因为
a[2]实际上就是b,
根据堆栈的特性,b声明在前,地址为ebp-4,a声明在后,为ebp-4*2-4
所以a[0] = ebp-12
a[1] = ebp-8
a[2] = ebp-4
a[3] = ebp
如果把a[2]改为a[3]也同样出错
iorizht 2005-10-28
  • 打赏
  • 举报
回复
printf("%d\n",a[2]);
printf("%d\n",*(p+2));
结果一个是2,一个是-4197100
不管*(p+2)指向哪里,不都把它实际存贮的数据赋为2了吗?为什么*(p+2)为负数呢?
iorizht 2005-10-28
  • 打赏
  • 举报
回复
我用的是unix(solaris),编译和运行都没抱错,是不是和编译环境有关啊
iorizht 2005-10-28
  • 打赏
  • 举报
回复
没抱错啊!!
goodluckyxl 2005-10-28
  • 打赏
  • 举报
回复
运行中报错
c编译器是不对越界做检测的
要不效率就木了
ilbgsm 2005-10-28
  • 打赏
  • 举报
回复
error?编译器报错么?
yzx1983 2005-10-28
  • 打赏
  • 举报
回复
楼上真细心^_^
a[2]是第3个元素了,a[1]才是b

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧