一.内存划分:(地址由高到低)
1.栈区
栈区的数据以栈的形式进行存储,特点:先进后出
函数体内存放的局部变量存放在栈区,由系统分配空间和系统释放.
开发人员不需要关心如何为局部变量分配空间.
int a = 10;
printf(“%p\n”,&a);
2.堆区由开发人员手动申请,手动释放,唯一一块由开发人员操作的区域.
1⃣申请内存的函数
void *malloc(size_t);
返回类型为:void *,泛型类,可以转化为其他类型.
malloc 为函数名, size_t 为参数, unsigned long 类型的参数,也就是传入的字节数
在堆区里申请4个字节的空间,返回的是申请空间的首地址.
int *p = malloc(4);
申请了4个连续字节,放100;
*p = 100;
printf(“%p\n”,p);
printf(“%d\n”,*P);
在堆中”iPhone”,多出一个字节,存放’\0’,为了安全
char *p1=malloc(7);
strcpy(p1,”iPhone");
// 将第三个字母改为’\0'
*(p1+2) =‘\0’;
strcpy((p1+2),”abcd");
printf(“%s\n”,p1);
内存泄露:一块内存一直被占用着,而得不到释放.
内存释放的函数
void free(void *);
free(p1);// 把对应的存储空间,置为可用状态
p1 = NULL;//把指针置为空
3.静态区
静态区也叫全局区,定义在函数外面的变量存放在全局区,使用关键字 static 修饰的变量也存放在静态区.由 static 修饰的和全局变量都是存放在静态全局区.静态区里的是数据也是由系统进行分配和释放空间.
由 static 修饰的变量特点:
1⃣被 static 修饰过的变量,存放在静态区;
2⃣被 static修饰的变量只会被初始化一次;
3⃣由 static 修饰变量没有初始化,系统默认为0;
static int a = 20;
for(int i = 0;i < 40;i++){
static int n = 0; 换成 n = 0;则打印的结果为:0,0,0,0,0,.....
printf(“%d\n”,n);
n++;
} 打印的结果:n = 0,1,2,3,4,5..
static int n;
printf(“%d\n”,n); n =0
4.常量区
常量(10,2,3.2,’c’,”lan ou”); 都存放在常量区
常量由系统分配空间和释放空间的.
常量区的数据只能读,不能改.
5.代码区
程序中运行的函数和语句都会编译成CPU 指令存放在代码区.
函数名的存放就是函数在代码区的首地址.
也是有系统分配空间和释放空间.
6.动态内存申请的其他函数
1⃣void calloc(count,size)
和 malloc 一样,申请内存空间,但是申请的内存空间,会做一个清空的操作;由于多了这一步,效率比malloc低;
count 个数 size 大小(字节个数) calloc申请的总字节数: count *size
返回值也是申请空间的首地址
int *p = calloc(20,4);
free(p);
p6 = NULL;
2⃣申请的其他函数realloc
realloc(*p,size); 从指针 p 的 位置开始,重新申请(size)多少个字节
int *p7 = malloc(2);
printf(“%p\n”,p7);
从 p7的位置申请,如果后面有 size 个连续字节的话,就直接申请;如果后面没有的话,就重新找一块 size 字节空间,找到的话就申请,并且把之前申请的字节进行释放,指针会重指向.
p7 = realloc(p7,40000);
printf(“%p\n”,p7);
free(p7);
p7 = NULL;
3⃣void memset(*p,c,size_t n);
从指针 p 开始初始化 n 个字节的内存,并把内容改为 c
int *p8 = malloc(4);
printf(“%d\ n”,*p8);
memset(p8,8,3);
printf(“%d\n”,*p8);
char *p9 = malloc(4);
memset(p9 ,’B’,1);
printf(“%s\n”,p9);
4⃣内存拷贝函数( 跟字符串拷贝函数的用法基本一致)
void *memcpy(void *dest,const void *source,size_t n);
从 source 指向的内存开始拷贝到 dest, 拷贝 n 个字节
从 source 的位置开始,向 dest 的位置,拷贝n个字节
char str[] = “ABC”;
char straight[] = “123”;
memcpy(str,str1,3);
printf(“%s\n”,str);
5⃣内存比较
int memcmp(const void *buf1,const void *buf2,unsigned int count)
比较 buf1和 buf2指向的内存是否相同,比较 count 个字节.
比较p1和p2 指向内存里的内容是相同的,比较 n 个字节,返回0,.相等.不同的时候返回差值
int *p_10 = malloc(4);
*p_10 = 108;
int *p_11 = mallioc(4);
*p_11 = 3;
int result = memcmp(p_10,p_11,1);
printf(“%p\n”,result);