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

      

  • 相关阅读:
    [转发]深入理解git,从研究git目录开始
    iOS系统网络抓包方法
    charles抓包工具
    iOS多线程中performSelector: 和dispatch_time的不同
    IOS Core Animation Advanced Techniques的学习笔记(五)
    IOS Core Animation Advanced Techniques的学习笔记(四)
    IOS Core Animation Advanced Techniques的学习笔记(三)
    IOS Core Animation Advanced Techniques的学习笔记(二)
    IOS Core Animation Advanced Techniques的学习笔记(一)
    VirtualBox复制CentOS后提示Device eth0 does not seem to be present的解决方法
  • 原文地址:https://www.cnblogs.com/lanjianhappy/p/10630558.html
Copyright © 2011-2022 走看看