• c语言学习之基础知识点介绍(十九):内存操作函数


    一、malloc函数

    /*
        首先需要导入头文件 #include <stdlib.h>
        malloc
           void*  malloc(n);
     
            n是字节大小
            开辟堆空间,开辟的字节数以n为准
            返回的是开辟空间的首地址
            void*是万能指针,也就是说你可以用任意类型的指针去指向
    
    */
    
     //malloc用法
    
     int *p =  malloc(sizeof(int));
       
      *p = 30;
      
     printf("%p    %d
    ",p,*p);//0x100105490
        
        
       char *pc = malloc(sizeof(char)*4);
        
        pc[0]= 'a';
       
       pc[1] = 'b';
     
      pc[2] = 'c';
       
       pc[3] = '';
       
       printf("%s
    ",pc);
        
       char *pc = malloc(4);
       
       *pc = 'a';
     
       *(pc+1) = 'b';
       
      *(pc+2) = 'c';
      
        *(pc+3) = '';
       
      printf("%s
    ",pc);
        
        
      char *pc = malloc(4);
       char *temp = pc;
      
       *pc = 'a';
       pc++; //自身+1
       
      *pc = 'b';
       
      pc++;
     *pc = 'c';
     
       pc++;
        *pc = '';
      
      printf("%s
    ",temp);
    
        
      char *pc = malloc(1);
       
       *pc = 'h';
      
     printf("%c
    ",*pc);

    二、calloc函数

    //calloc用法
    
        int nums[3] = {10,20,30};//在栈区
      int *p = calloc(4, 3);//在堆区
     p[0] = 10;
      p[1] = 20;
    p[2] = 30;
     for (int i =0; i<3; i++) {
       printf("%d
    ",p[i]);
      }
        
        int *p = calloc(4, 3);//在堆区
        
        *(p) = 10;
        *(p+1) = 20;
        *(p+2) = 30;
        
        for (int i =0; i<3; i++) {
            
            printf("%d
    ",p[i]);
        }

    malloc和calloc的区别:
          malloc不会初始化,会有垃圾值,calloc会初始化为0

    char *pch = malloc(100);
        
        for (int i =0; i<100; i++) {
            
            printf("%d  ",*(pch+i));
        }
        
        printf("
    ------------分割线-------------
    ");
        
        char *pch2 = calloc(1, 100);
        
        for (int i =0; i<100; i++) {
            
            printf("%d  ",*(pch2+i));
        }

    三、realloc函数

    /*
    当自己手动开辟出来的空间不够用了,这个时候我们需要去扩容,就得用到realloc这个函数。
     
            realloc:
                    realloc(要扩容的空间首地址,操作后的字节大小);
     
     
            作用:把你传入的空间进行扩容或者缩小,操作后的字节大小以后面的参数为准。
     
            注意:用realloc函数的时候最好再用指针变量接收一下返回值。
                        因为你扩容的时候,很可能是系统帮你在一块新的足够大的空间里面进行扩容了,那样空间首地址就发生改变了。
    
    */
    
       //realloc的使用
        char *p = malloc(100);
        
        *p = "的手机客户端还是把空间分布的刷卡缴费多少部分科技的设备房间号多少功夫空间都是给我看一个";
        //所以要重新接收一下
        p = realloc(p, 1000);//放大
        p = realloc(p, 50);//缩小
        
       
      

    四、内存泄露

    /*
    内存泄露:
            内存容量有限,然后如果你不及时回收不要用的空间,而是一直开辟新的空间,那么内存就会不够用,就叫内存泄露(像水杯装水一样)。
     
            代码里面:某块空间一直占据,没被回收就叫内存泄露。
     
     
    回收自己开辟的堆空间:
                free:
                    free(要回收的空间首地址);
    
     野指针:指向的是已被回收的空间的指针叫野指针。指向不可用的内存空间叫野指针。
     
     防止野指针:
            就是在回收后,立即将指针变量置为NULL。
    */
    int *p = malloc(4);//内存泄露
        
        //因为没有对p指向的堆空间进行回收,所以就内存泄露
        
        //那么程序自己怎么回收??
        
        free(p);//此时p指向的空间首地址就被回收了,此时p变为野指针
        
        p = NULL; //p指向的空间被回收后,要立即把p置为NULL,防止野指针错误
  • 相关阅读:
    过国内外的waf的一些奇淫绝技<转>
    杂七杂八的敏感文件注释<持续更新帖>
    [讨论]“传递式”的攻击思想<转LN>
    无线hacking集合贴,持续更新~
    dede找后台《转》
    开源MFC扩展界面库:Ultimate Toolbox的编译(转)
    【转】Windows环境下设置Tomcat6启动参数
    [转]关于dll文件的生成以及找不到jni.h的解决办法
    VBA 7788
    ODBC连接EXCEL的一些问题
  • 原文地址:https://www.cnblogs.com/bobo-pcb/p/4950459.html
Copyright © 2020-2023  润新知