按需分配。
大块内存:堆内存管理者总量很大的操作系统内存块,各进程可以按需申请使用,使用完释放。
程序手动申请&释放:手工意思是需要写代码去申请malloc和释放free。
脏内存:堆内存也是反复使用的,而且使用者用完释放前不会清除,因此也是脏的。
临时性:堆内存只在malloc和free之间属于我这个进程,而可以访问。在malloc之前和free之后都不能再访问,否则会有不可预料的后果。
---堆内存使用范例
(1)void *是个指针类型,malloc返回的是一个void *类型的指针
为什么要使用void*作为类型?主要原因是malloc帮我们分配内存时只是分配了内存空间
(2)什么是void类型。void类型不表示没有类型,而表示万能类型。
(3)malloc的返回值:成功申请空间后返回这个内存空间的指针,申请失败时返回NULL。所以malloc获取的内存指针使用前一定要先检验是否为NULL。
(4)malloc申请的内存时用完后要free释放。free(p);
(5)第一步:申请和绑定,int *p=(int*)malloc(1000*sizeof(int));
第二步:检验配置是否成功,if(null==p)printf("malloc error!");
第三步:使用;第四步:释放,free(p);
---malloc的一些细节表现
malloc(4)
gcc中的malloc默认最小是以16B为分配单位的。如果malloc小于16B的大小时都会返回一个16字节的大小的内存。
代码段:代码段就是程序中的可执行部分,直观理解代码段就是函数堆叠组成的。
数据段(也被称为数据区、静态数据区、静态区):数据段就是程序中的数据,直观理解就是C语言程序中的全局变量。(注意:全局变量才算是程序的数据,局部变量不算程序的数据,只能算是函数的数据)
bss段(又叫ZI(zero initial)段):bss段的特点就是被初始化为0,bss段本质上也是属于数据段,bss段就是被初始化为0的数据段。
---有些特殊数据会被放到代码段
C语言中使用char *p = "linux";定义字符串时,字符串"linux"实际被分配在代码段,也就是说这个"linux"字符串实际上是一个常量字符串而不是变量字符串。
---C语言使用指针来管理字符串
*C语言中字符串有3个核心要点:第一是用一个指针指向字符串头;第二是固定尾部(字符串总是以'\0'来结尾);第三是组成字符串的各字符彼此地址相连。
*'\0'是一个ASCII字符,其实就是编码为0的那个字符(真正的0,和数字0是不同的,数字0有它自己的ASCII编码)。要注意区分'\0'和'0'和0.(0等于'\0','0'等于48)
---字符数组初始化与sizeof、strlen
(3)sizeof(数组名)得到的永远是数组的元素个数(也就是数组的大小),和数组中有无初始化,初始化多、少等是没有关系的;strlen是用来计算字符串的长度的,只能传递合法的字符串进去才有意义
---字符串初始化与sizeof、strlen
(1)char *p = "linux"; sizeof(p)得到的永远是4,因为这时候sizeof测的是字符指针p本身的长度,和字符串的长度是无关的。
(2)strlen刚好用来计算字符串的长度。
// 字符串存在栈上
char a[7];
char *p = a;
// 字符串存在数据段
char *p = b;
// 字符串存在堆空间
char *p = (char *)malloc(5);
大块内存:堆内存管理者总量很大的操作系统内存块,各进程可以按需申请使用,使用完释放。
程序手动申请&释放:手工意思是需要写代码去申请malloc和释放free。
脏内存:堆内存也是反复使用的,而且使用者用完释放前不会清除,因此也是脏的。
临时性:堆内存只在malloc和free之间属于我这个进程,而可以访问。在malloc之前和free之后都不能再访问,否则会有不可预料的后果。
---堆内存使用范例
(1)void *是个指针类型,malloc返回的是一个void *类型的指针
为什么要使用void*作为类型?主要原因是malloc帮我们分配内存时只是分配了内存空间
(2)什么是void类型。void类型不表示没有类型,而表示万能类型。
(3)malloc的返回值:成功申请空间后返回这个内存空间的指针,申请失败时返回NULL。所以malloc获取的内存指针使用前一定要先检验是否为NULL。
(4)malloc申请的内存时用完后要free释放。free(p);
(5)第一步:申请和绑定,int *p=(int*)malloc(1000*sizeof(int));
第二步:检验配置是否成功,if(null==p)printf("malloc error!");
第三步:使用;第四步:释放,free(p);
---malloc的一些细节表现
malloc(4)
gcc中的malloc默认最小是以16B为分配单位的。如果malloc小于16B的大小时都会返回一个16字节的大小的内存。
代码段:代码段就是程序中的可执行部分,直观理解代码段就是函数堆叠组成的。
数据段(也被称为数据区、静态数据区、静态区):数据段就是程序中的数据,直观理解就是C语言程序中的全局变量。(注意:全局变量才算是程序的数据,局部变量不算程序的数据,只能算是函数的数据)
bss段(又叫ZI(zero initial)段):bss段的特点就是被初始化为0,bss段本质上也是属于数据段,bss段就是被初始化为0的数据段。
---有些特殊数据会被放到代码段
C语言中使用char *p = "linux";定义字符串时,字符串"linux"实际被分配在代码段,也就是说这个"linux"字符串实际上是一个常量字符串而不是变量字符串。
---C语言使用指针来管理字符串
*C语言中字符串有3个核心要点:第一是用一个指针指向字符串头;第二是固定尾部(字符串总是以'\0'来结尾);第三是组成字符串的各字符彼此地址相连。
*'\0'是一个ASCII字符,其实就是编码为0的那个字符(真正的0,和数字0是不同的,数字0有它自己的ASCII编码)。要注意区分'\0'和'0'和0.(0等于'\0','0'等于48)
---字符数组初始化与sizeof、strlen
(3)sizeof(数组名)得到的永远是数组的元素个数(也就是数组的大小),和数组中有无初始化,初始化多、少等是没有关系的;strlen是用来计算字符串的长度的,只能传递合法的字符串进去才有意义
---字符串初始化与sizeof、strlen
(1)char *p = "linux"; sizeof(p)得到的永远是4,因为这时候sizeof测的是字符指针p本身的长度,和字符串的长度是无关的。
(2)strlen刚好用来计算字符串的长度。
// 字符串存在栈上
char a[7];
char *p = a;
// 字符串存在数据段
char *p = b;
// 字符串存在堆空间
char *p = (char *)malloc(5);