程序与内存:
内存用来存放程序运行之中的一些临时变量,是程序运行的地方。
内存的管理由操作系统统一完成。程序根据实际情况获取内存,使用内存,释放内存。
在64位操作系统内,指针所占的内存为8个字节,而在32位操作系统中,指针占4个字节。
三种内存来源:栈(stack),堆(heap),数据区(.data)
栈的详解:
(先进后出) (小块内部内存,且内存大小固定)
1.运行时自动分配,自动回收,栈可以自动管理,不需要程序员手工干预。
2.反复使用:栈内存就是内存中是一个固定的空间区域,
3.由于栈的反复使用,导致栈内存是脏内存,每次使用完程序不会去清理,因此二次分配使用时保留的是原本的值。示例体现:定义局部变量时局部变量的值是随机的,所以定义局部变量的时候必须初始化。
4.临时性:函数不能返回栈变量的指针(局部变量的指针)。因为这个函数执行完返回后这个局部变量已经不在了,但是由于局部变量是分配在栈上面的,栈内的内存仍然可以使用,但是此时的内存地址和之前的局部变量已经没有联系了。
堆内存:
1.由堆管理器(操作系统的一个模块)管理,堆的内存分配方式灵活,按需分配。各进程手动按需申请,使用完手动释放。手工的意思是写代码去申请 malloc 释放 free.
2.脏内存:使用者使用完释放前不会清除,因此也是脏的。
3.临时性:仅在malloc和free之间属于本内存,可以访问。
注:malloc 返回的是一个 void *类型的指针(void早期被翻译为空型,表示万能类型),实质上 malloc返回的是堆管理器分配给程序此次申请的那段内存空间的首地址(以数字形式表示,这个数字代表内存地址)。malloc为程序申请的内存空间可以存放各种类型的变量(malloc为程序申请内存空间时,不关注这段内存是用来存储什么类型的变量,由程序自己决定)
使用的格式:1.申请和绑定 int(char float....)*p int(*)malloc(内存空间大小)
2.检验是否成功,if(p==NULL) //检验是否成功