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

来源:互联网 发布:火车头淘宝采集规则 编辑:程序博客网 时间:2024/05/16 18:28

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 = 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);//测试自己写的函数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的因为这个不是字符串,字符串才需要加1int *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;}


    

    
    
    
    
    
   
0 0