c 语言中内存的动态分配(allocate)和释放(free)

               

0: C语言的数据结构,通常都是固定大小的,例如:数组有固定的大小

数组的使用一般是静态的,但是也可以动态的修改,方法就是内存的动态的分配

1:动态内存分配,malloc

2:动态分配字符串,malloc(n+1);

3:动态分配数组,如果是int 类型的数组就是malloc(n*sizeof(int))

4:释放内存


1: 内存分配函数(allocate 分配的意思)
malloc(manual) 函数,分配内存,但是不对内存进行初始化,
calloc (clean)函数,分配内存,并且对内存进行初始化
reallco(redo)函数,调整分配过的内存。重新分配内存
这些函数包含在<stdlib.h>头文件中


2: c中的字符占用一个字节大小,为n个大小的字符串(羊肉串)分配空间,可以使用malloc(n+1)来分配,多出来的一个字节保存字符串的结束符“\0”,注意这个是零

    注意这里是字符串,不是int的类型的数组
//c中的字符占用一个字节大小,为n个大小的字符串分配空间,可以使用malloc(n+1)来分配,多出来的一个字节保存字符串的结束符“\0”,注意这个事零        int n = 5;    char *str = malloc(n+1);//最后一个+1就是'\0'    //strcpy 需要导入#include <string.h>    strcpy(str,"hello");//string copy 注意这里hello是5个字节    printf("%s\n",str);


//两个字符串连在一起应该分配多大的空间呢?    //系统中已经定义好了叫做strcat的函数 cat catenate 的缩写 意思是连接,连续的    char str1[30] = "Hello";//注意这里一定要能够把第一个字符串和第二个字符串一起装进去,如果给它5就不行    char *str2 = "  World";        char *result = strcat(str1,str2);//将第二个装到第一个里面去    printf("result=%s\n",result); 

  
    
3:动态分配数组
3.1当编程时很难为数组估计大小,可以再运行程序时,动态为程序分配大小
3.2动态分配数组大小和分配字符串大小相似,可以使用sizeof 来计算数据类型占用的字节数,再来分配,例如:
int *a = malloc(n*sizeof(int));
3.3 可以使用calloc 来分配内存大小,calloc 可以对分配的内存进行初始化。calloc的函数原型为:
    void * calloc(size_t nmenb,size_t size)
    使用calloc 分配数组内存大小,
    int *a = calloc(n,sizeof(int));
3.4 可以使用void *recalloc(void *ptr,size_t size) 来调整内存的大小,size 为新内存的大小   
        int a[5]={1,2,3,4,5};            int *ip = malloc(sizeof(int)*5);//这里是不需要+1的因为这个不是字符串,字符串才需要加1            int *cip = calloc(5,sizeof(int));//            realloc(ip,100);

   
 4:释放内存
4.1 malloc 等内存分配函数分配的内存,会在内存堆里面,如果一直分配都会造成内存耗尽的危险
堆内存是我们自己调用自己释放,栈内存是c语言自己调用的自己释放的,
这个有点像吃饭的,有的是自己收盘子的,有的需要客户把盘子放到指定的地方的。

4.2 分配的内存不再使用需要手动释放,释放函数式void free(void *ptr);


#include <stdio.h>#include <stdlib.h>#include <string.h>//stdlib的头文件里面包含了malloc,calloc,reallocchar * concat(char *str1,char *str2){ //主要是看看使用malloc的函数 char *result = malloc(sizeof(str1)+sizeof(str2)+1); strcpy(result,str1);//先拷贝 strcat(result,str2);//然后连接 return result;}int main(int argc,const char *argv[]){ //malloc(manual) 函数,分配内存,但是不对内存进行初始化, //calloc (clean)函数,分配内存,并且对内存进行初始化 //reallco(redo)函数,调整分配过的内存。重新分配内存 //这些函数包含在<stdlib.h>头文件中 //void * 表示任意的指针类型的 void *a = malloc(1024);//就是说a 可以是float *a, int *a  //动态分配字符串 //malloc 函数原型 void *malloc(size_t size); size_t 是一个无符号整形, //c中的字符占用一个字节大小,为n个大小的字符串分配空间,可以使用malloc(n+1)来分配,多出来的一个字节保存字符串的结束符“\0”,注意这个事零  int n = 5char *str = malloc(n+1);//最后一个+1就是'\0' //strcpy 需要导入#include <string.h> strcpy(str,"hello");//string copy 注意这里hello是5个字节 printf("%s\n",str);  //两个字符串连在一起应该分配多大的空间呢? //系统中已经定义好了叫做strcat的函数 cat catenate 的缩写 意思是连接,连续的 char str1[30] = "Hello";//注意这里一定要能够把第一个字符串和第二个字符串一起装进去,如果给它5就不行 char *str2 = "  World";  char *result = strcat(str1,str2);//将第二个装到第一个里面去 printf("result=%s\n",result);  //测试自己写的函数 char *myresult = concat(str1,str2); printf("myresult=%s\n",myresult);  /* 3:动态分配数组  3.1当编程时很难为数组估计大小,可以再运行程序时,动态为程序分配大小  3.2动态分配数组大小和分配字符串大小相似,可以使用sizeof 来计算数据类型占用的字节数,再来分配,例如:  int *a = malloc(n*sizeof(int));  3.3 可以使用calloc 来分配内存大小,calloc 可以对分配的内存进行初始化。calloc的函数原型为:   void * calloc(size_t nmenb,size_t size)    使用calloc 分配数组内存大小,   int *a = calloc(n,sizeof(int));  3.4 可以使用void *recalloc(void *ptr,size_t size) 来调整内存的大小,size 为新内存的大小 */ //动态分配数组内存  int aa[5]={1,2,3,4,5}; int *ipp = malloc(sizeof(int)*5);//这里是不需要+1的因为这个不是字符串,字符串才需要加1 int *cip = calloc(5,sizeof(int));// realloc(ipp,100);   //内存使用完了一定要free,上完茅厕赶快走,别站着茅坑不拉屎 //free(str); //内存的释放: int *aaa,*bbb; aaa = malloc(100); bbb = malloc(200); free(aaa); //要在赋值之前,先free(aaa),不然aaa不好释放 aaa=bbb; free(bbb);    return 0;}


    

    
    
    
    
    
   
           

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值