day11动态内存分配

1.内存区域的划分(从高到低
a.栈区    栈 (先进后出)      队列(先进先出)
b.堆区(重点)
c.静态区(全局区)只初始化一次;如果初始化没给值,系统默认为零;只有程序退出才释放
d.常量区    常量占用内存,只读状态,绝不可修改
e.代码区

2. 栈区      一个程序在内存中栈区大概分配7~8M的栈区内存,递归能很快的吃掉内存
3.局部变量存在于栈区,有系统为其分配空间和释放空间,开发人员不需要关系栈区的管理
4.常量区  (’a’,10,“iphone”,3.14),都存在于常量区,常量区的内容是不允许修改的,常量区的数据也是有系统分配的,不需要开发人员管理
5.静态区    (全局区)有static 修饰的变量存放在静态区,静态区的变量有一个特点整个程序运行过程中,只被初始化一次,如果没有初始化,系统会默认为0
6.代码区     程序中运行的函数 或者变量等一些其他的语句都会编译成cpu指令放在代码区;系统提供的函数由于使用比较频繁,我们把它存放在栈区,原因栈区的内容会被反复的创建销毁,不需要我们去管理内存,还有是因为栈区的内存开辟和释放都是非常迅速的
7. 堆区    是唯一一块开发者能够控制的内存区域,这块区域内存我们要手动申请,并且手动释放
malloc 代表申请内存的函数
void *mallocsize_t)
void *,泛类型,返回的指针可以赋值给任何类型的指针,eg:int*,float*,char*,short*
size_t代表申请多少个字节大小的内存空间
malloc的作用:申请size个字节大小的空间,并把申请空间的首地址返回
 char *p = malloc(8);//p内存存储的是8个空间的首地址
    //*p = "iphone";
数组不能直接赋值
    strcpy(p, "iphone");//
往堆区空间存储字符串
    printf("%s\n",p);


8.free(p)
p  =NULL   指向的无效空间,防止野指针错误
释放掉p指向的对去空间,只是标记删除,不清空里面的内容;过度释放,释放多次,过度释放会造成崩溃


9.其他的内存分配函数
calloc(n,4)表示:两个参数的意思,申请n个size大小的空间,返回时申请空间的首地址,但是它在申请空间的时候会多做一个处理,清除每一个字节里的内存,也就是清零操作,正式因为calloc多了一步轻灵的操作,执行效率要比malloc低

10.relloc(p,n)内存的重新分配函数,第一个参数是地址,第二个参数重新分配的内存大小;使用relloc重新分配空间的时候,如果在原有空间的基础上可以连续在增加(n -原来空间大小)的空间,指针的指向不会改变,如果这时不可以连续增加(n-原来空间的大小),会将之前的空间给释放掉,然后,再去堆区的其他位置开辟连续的n个空间大小的内存,指针的指向发生改变了
int *p = malloc(12);
    *p = 10;
    *(p+1) = 20;
    *(p+2) = 30;
     printf("
之前的地址%p\n",p);
    p = realloc(p, 20);//
重新申请空间的大小
    printf("
之后的地址%p\n",p);
    *(p+3) = 40;
    *(p+4) = 50;
    //
重新分配的空间会把之前的空间里的内容给拷贝过来,放到相应的位置
    for (int i =0; i < 5; i++) {
        printf("%d\t",*(p+i));
    }
    free(p);
    p = NULL;



11.memset(开始地址,n,size);给定一个开始地址,将size的空间大小的数据视为n,如果n为零,size为10,就是把10个字节中的数据视为0;

int *p7  = malloc(12);
   
memset(p7, 1, 4);
    printf("%d\n",*p7);


  char *p7 = malloc(4);
    memset(p7, 97, 2);
    printf("%c\n",*p7);
    printf("%c\n",*(p7+1));


11.memcpy(dest,source,n)从原指针开始向目的指针拷贝n个字节的数据

char str1[] ="ABC";
   
char str2[] ="123";
   
memcpy(str1, str2, 2);
    printf("%s\n",str1);


12.memcmp(p1,p2,n);比较p1和p2指向内存里的内存是否相同,比较n个字节,返回值是0,相等,不同的时候,返回差值;比较的过程是追个字节比较,返回第一对对应字节的位置不相同数据的差值
一个字节表示范围( -256~255 )这是有符号的     无符号的字节范围( 0~255
int *p8 = malloc(4);
    *p8 = 260;
   
int *p9 = malloc(4);
    *p9  =
772;
   
int result = memcmp(p8, p9, 2);
   
printf("%d\n",result);
   
free(p8);
    p8 =
NULL;
   
free(p9);
    p9=
NULL
;
   

13.被static修饰的全局变量,生命周期随着程序的创建而创建,随着程序的消失而消失














  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值