返回信息流void func1()
{
char a[3];
for (int i = 0;;i++)
{
a[i] = 'a' + i;
}
}
void func2()
{
char *p=(char*)malloc(3);
for (int i = 0;; i++)
{
p[i] = 'a' + i;
}
}
请问上面这两个函数中,数组越界的情况有什么不同?比如抛出的异常的种类是否相同?
这是一条镜像帖。来源:北邮人论坛 / cpp / #86992同步于 2015/5/9
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
【请教】堆中和栈中数组越界的情况有什么不同?
en911
2015/5/9镜像同步13 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
栈是从顶向下增长,你几乎可以一直访问到用户地址空间的顶部,都不会立即出错
堆是从底向上增长,如果你刚刚申请的内存是在堆的顶部的话,你最多访问4096个字节就会出错
【 在 en911 的大作中提到: 】
: void func1()
: {
: char a[3];
: ...................
那这两个函数的无定义行为有什么区别?
【 在 nuanyangyang 的大作中提到: 】
: 访问无效的指针是“未定义行为”,从什么都不发生到机器冒烟都是可以的。
来自「北邮人论坛手机版」
【 在 en911 的大作中提到: 】
: 那这两个函数的无定义行为有什么区别?
:
: 来自「北邮人论坛手机版」
有任何区别都是可能的,一切取决于语言实现(编译器、标准库、操作系统、硬件……),只有你想不到,没有做不到。
栈这个东西是系统管理的,限制比较严,越界是一定会给出错误的,堆的管理主要是程序员,可能不会给出什么错误。
void stack_over(){
char a[3];
int black[512];
char *p = a;
for(int i=0;i<5;++i){
*p = 'a'+i;
++p;
}
}
void heap_over(){
char *a = (char*) malloc(3);
for(int i = 0;i<5;++i){
*a++='a'+i;
}
}
int main(){
//stack_over();
heap_over();
return 0;
}
我在visual studio中,只有执行stack_over()的时候有一个运行时错误。
没有不同,都是两点致使程序挂掉,一是把内存空间挤满挂掉,二是向没有写入权限的地址试图写入数据而使程序挂掉。
【 在 en911 的大作中提到: 】
: void func1()
: {
: char a[3];
: ...................
谢谢,我跑了一下你的程序,确实如此。
【 在 xionger 的大作中提到: 】
: 栈这个东西是系统管理的,限制比较严,越界是一定会给出错误的,堆的管理主要是程序员,可能不会给出什么错误。
: void stack_over(){
: char a[3];
: ...................
这些东西本来就不属于语言级别的特性,和编译器、运行环境等等相关,如果不是有什么特殊目的,就不需要去研究这些东西,也完全可以避免这些东西
拿x86来说,栈上通常压了局部变量、栈底指针、返回地址之类的东西,越界了可能把这些东西覆盖掉,你的程序不一定会出现什么奇怪的情况
堆里越界也可能破坏了堆原本的结构,比如链表状的内存块,也是会出现各种奇怪的情况,比如暖神说的机器冒烟