博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
<c和指针>学习笔记5动态内存分配和预处理器
阅读量:4619 次
发布时间:2019-06-09

本文共 1921 字,大约阅读时间需要 6 分钟。

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!\n");

    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\n",SOUARE(a+1))//11 不是36哦,实际上是a+1*a+1

(2)#和##

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

    #define PRINT(FORMAT,VALUE)   \

         printf("the value of" #VALUE  \

        " is " FORMAT "\n",VALUE)

    PRINT("%d",x+3)

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

(3)#undef

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

(4)条件编译

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

  #if statement    #if DEBUG

    staement      printf("x=%d,y=%d\n",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

  

转载于:https://www.cnblogs.com/lanjianhappy/p/10630558.html

你可能感兴趣的文章
DataSource数据库的使用
查看>>
Luogu4069 SDOI2016 游戏 树链剖分、李超线段树
查看>>
Java的内部类真的那么难以理解?
查看>>
一文搞懂Java环境,轻松实现Hello World!
查看>>
hash实现锚点平滑滚动定位
查看>>
也谈智能手机游戏开发中的分辨率自适应问题
查看>>
关于 IOS 发布的点点滴滴记录(一)
查看>>
《EMCAScript6入门》读书笔记——14.Promise对象
查看>>
CSS——水平/垂直居中
查看>>
Eclipse连接mysql数据库jdbc下载(图文)
查看>>
Python中Selenium的使用方法
查看>>
三月23日测试Fiddler
查看>>
20171013_数据库新环境后期操作
查看>>
poj 1654 && poj 1675
查看>>
运维派 企业面试题1 监控MySQL主从同步是否异常
查看>>
Docker 版本
查看>>
poj 1753 Flip Game
查看>>
在深信服实习是怎样的体验(研发测试岗)
查看>>
Linux免密码登陆
查看>>
SpringMVC中文件的上传(上传到服务器)和下载问题(二)--------下载
查看>>