堆 栈 段 的区别
2169查看
LOU1774223875
2015-07-31 16:01

堆里面的数据越界访问不为空,栈里面的数据越界访问为空 这是为什么,还有就是上面三个有什么区别?

全部回复(6)
hanliumaozhi
2015-08-01 00:27

在进程的虚拟内存中 堆和栈

图片描述

  1. 堆是 用来存储全局变量和动态产生的数据。

  2. 栈是 用于保存局部变量和实现函数/过程调用。

如果只是纯软件意义上的 段 段只是虚拟内存地址空间中用于保存数据的区域

回复
LOU1774223875
2015-08-01 01:00

谢谢 竟然还有图 好惊喜

回复
x250
x250
L146
2015-08-01 00:35

段的概念

所谓的代码段、(堆栈段)栈段、数据段,不过是我们(程序员)对内存的一种逻辑划分

那么说一下栈和堆的区别

栈(操作系统):由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 堆(操作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。

简单的说:栈是计算机管理,堆是程序员管理

关于越界的问题:

  1. 栈越界 向上越界(往一个满了栈push数据)和向下越界(从空栈pop数据),无论怎么越界,范围都在64kb内,这是寄存器决定的,所以sp指针为空
  2. 堆越界 类似数组越界,指针指向其他内存块了
回复
LOU1774223875
回复
x250
L146
2015-08-01 01:03

int *q ; int *p = (int *)(malloc(sizeof(int)));

这个输出*(q+1)值不为0 *(p+1)值为0

为什么?

回复
x250
x250
L146
回复
2015-08-01 01:11

int p = (int *)(malloc(sizeof(int)));
*(p+1)
这里完成了指针的初始化,malloc是申请内存,分配的是一个空指针

一定要注意下指针的初始化,要么用malloc,要么赋值 int a;*q=a
指针没有初始化是不能用的,
我记得有我们C++的期中考试第一题就是考的这个

回复
LOU1774223875
回复
x250
L146
2015-08-01 01:32

我的运行环境时 mac 装的 zsh shell 用的 vim编辑器 不初始化 不会抱错

回复
你的回复