社区
C语言
帖子详情
指针越界访问和数组越界访问有什么区别?
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
打赏
收藏
指针越界访问和数组越界访问有什么区别?
void main() { int a[1]; a[2] = 2; // ok! int* p = a; *(p+2) = 2; // error! } 为什么有这样的不同!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
java常见错误集
java常见错误处理,java,struts,jsp,jquery,
数组
越界
,空
指针
异常
课程设计报告+李浩1
2. 空
指针
异常和
数组
越界
异常没有处理好 3. frameset跳转问题没弄清 4. 权限过滤器和利用session传值的方法理解不是很清晰2.6成果展示1、注
精通C语言
指针
指针
被誉为C语言的精髓、C本质上是加了一层语法糖的汇编,引进当时先进的函数,保留了汇编强大的地址直接
访问
功能 ——
指针
,使其高效灵活。本课程是黄强老师对于
指针
的一次专题讲解,相信能给大家带来收获!
java中两大异常:空
指针
异常和
数组
越界
异常
一、空
指针
异常 1.所谓的
指针
,就是java中的对象的引用。比如String s;这个s就是
指针
。 2.所谓的空
指针
,就是
指针
的内容为空,比如上面的s,如果令它指向null,就是空
指针
。 3.所谓的空
指针
异常,就是一个
指针
是...
[ C语言 ] 还不懂
指针
的一定要进来,带你初始
指针
,简单使用
指针
,它没有你想的那么难。
2.
指针
越界
访问
3.
指针
指向的空间释放 3.2 如何规避野
指针
四.
指针
运算 五.
指针
和
数组
六. 二级
指针
七.
指针
数组
总结 前言 本篇博客主要是初始
指针
,简单使用
指针
,在日常的使用解决问题中运用...
C语言
69,371
社区成员
243,080
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章