通常程序访问的是虚拟内存,虚拟内存映射到物理内存的一小部分。
在Linux系统中,虚拟内存默认为4G的大小。每个进程都有独立的4G内存地址空间。
int main()
{char s[] = "hello world"; //s数组位于栈区,复制了一份字符串到数组里char *s = "hello world"; //s指针位于栈区,字符串位于常量区char *s = malloc(128); //分配的128字节区域位于堆区
}
栈与堆的区别:
1、管理方式不同:堆的申请malloc()与释放free()由程序员来完成,栈由系统编译器自动分配
2、空间大小不同:堆空间大于栈空间
3、栈在内存中连续分配,不会产生碎片。堆的频繁申请可能造成内存空间的不连续性,产生大量碎片
4、增长方式不同:栈向内存地址减小的方向增长,堆则相反
5、分配效率不同:计算机在底层提供寄存器存放栈的地址,压栈出栈有专门的指令;堆由c函数库提供,需要有一定的算法去寻找申请足够大的地址空间。
内存错误情况:
1、指针没有指向一块合法的内存,
2、指针没有初始化地址。
int * p; //1、野指针
char *p = NULL; //2、空指针
*p = 100; //以上两种情况,都会引起段错误
3、指针分配的内存太小
4、内存越界
5、内存泄漏
6、内存释放后,继续使用该指针