zoukankan      html  css  js  c++  java
  • <c和指针>学习笔记5动态内存分配和预处理器

    1 动态内存

      比如声明数组得时候,我们需要提前预估数组长度,分配大了浪费,少了就更不好操作了。从而引入动态分配,需要的时候再分配。

    (1)malloc和free

      void *malloc(size_t size)

      void free(void *pointer)

      注意需要对每个malloc返回的指针进行检查,确保不是NULL。

    (2)calloc和realloc

      malloc和callo得区别是后者在返回指向内存的指针之前把它初始化位0

      void *calloc(size_t num_elements,size_t element_size)

      realloc用于修改一个原先已经分配好的内存块大小

      void realloc(void *ptr,size_t new_size)

    (3)动态内存分配得用法

      比如想足够存储25个整数的内存

        pi=malloc(25*sizeof(int))

    (4)小技巧之malloc宏定义

    #include <stdlib.h>

    //如果程序偶尔调用malloc 程序由于错误无法编译

    #define malloc 不要直接使用malloc

    //接受元素得数目以及每种元素得类型 计算总共需要的内存字节数。alloc调用malloc并检查,确保返回的指针不是NULL

    #define MALLOC(num,type) (type *)alloc((num)+sizeof(type))

    #include "alloc.h"

    #undef malloc

    void* alloc(size_t size)

    {

          void * new_mem;

          new_mem=malloc(size);

          if(new_mem==NULL)

       {

                  printf("out of memory! ");

        exit(1);

          }

      return new_mem;

    }

    2 预处理器

    (1)预定义符号

      __FILE__:文件的文件名

      __LINE__:文件当前行的行号

      __DATA__:文件被编译的日期

      __TIME__:文件被编译得时间

      这几个常用于debug输出

      #define DEBUG_PRINT printf("FILE %s line %d:"

          "x=%d,y=%d,z=%d",

           __FILE__,__LINE__,

         X,Y,Z)

    (2)#define

      #define name stuff

        每当符号name出现在这条指令后面时,预处理器就会把它替换成stuff,当然,替换文本不仅限于数值字面值chagnl,也可以如下

      #define reg register

      #define do_forever for(;;)

      #define CASE break;case;

      常见错误

        #define SOUARE(X)  X*X

        a=5

        printf("%d ",SOUARE(a+1))//11 不是36哦,实际上是a+1*a+1

    (2)#和##

      #:可以将宏参数转换为一个字符串

        #define PRINT(FORMAT,VALUE)   

             printf("the value of" #VALUE  

            " is " FORMAT " ",VALUE)

        PRINT("%d",x+3)

      ##它是位于它两边的符号链接成一个符号

    (3)#undef

      这条预处理指令用于移除一个宏定义

    (4)条件编译

      可以选择代码的一部分被正常编译还是完全忽略

      #if statement    #if DEBUG

        staement      printf("x=%d,y=%d ",x+y)

      #endif       #endif

                如果要使用 就应该使用#defnie DEBUG 1

    (5)文件包含

      本地包含:使用“ ” 例如#include “a.h”

      函数库文件:使用<>  例如#include <stdio.h>在linux中通常去/usr/include查找

      注意:

        为了避免头文件重复包含

          #ifndef __a__h

          #define __a__h 1

          #endif

      

  • 相关阅读:
    通过JavaScript垃圾回收机制来理解WeakSet/WeakMap中对象的弱引用
    json处理
    dotenv 加载本地环境变量
    各种ast库
    类型检测库
    npm 加解密库
    用计算机语言的爱情表白
    情侣在招聘会上搂抱招致企业反感
    《软件性能测试与LoadRunner实战》网上订购问题
    F1赛车的起源
  • 原文地址:https://www.cnblogs.com/lanjianhappy/p/10630558.html
Copyright © 2011-2022 走看看