栈, 是硬件, 主要作用表现为一种数据结构, 是只能在一端(栈顶, 另一端为栈底)插入和删除数据的特殊线性表, 在计算机系统的动态内存区域.
关于栈, 有后进先出/先进后出两个说法, 其实都是正确的, 只是关注点不一样, 一个是后入栈的数据, 一个是先入栈的数据. 根据栈的特性, 后入栈的数据总在先入栈的数据上方, 因为栈仅有一个口(出口和入口是统一的), 先入栈的数据要出栈的话, 就必须把在这之后的数据全部出栈. 有点类似从羽毛球桶里面取球和放球的操作, 当然, 另一头是封死的.
从书中看到, “压栈的操作使栈顶的地址减小,弹出的操作使栈顶的地址增大”, 这句是存疑的. 也就是说栈的数据从高地址向低地址的走向, 但是现在是虚拟内存地址, 总感觉这里怪怪的, 栈顶的走向应该体系架构相关的.
堆, 是一种动态存储结构, 实际上就是数据段中的自由存储区, 常常用于存储、分配动态数据.
堆中存入的数据地址向增加方向变动. 关于堆, 有先进先出的特性, 也就是一边是入口, 一边是出口, 像管道一样, 两头通, 只是限制每头的入和出. 堆内存通常malloc()
, calloc()
, realloc()
三个函数来分配, 使用free()
释放.
#include <stdio.h>
#include <stdlib.h>
int main() {
char *a;
char