<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!\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
最新文章
- lcok-free简易实现
- UIkit框架之uiUIapplication
- JDK-Logger
- Solr5.0配置中文分词包
- Android之使用Volley框架在ListView中加载大量图片
- vertical-align及IE7下的inline-block
- ContentProvider官方教程(1)何时用content provider
- C++-模板的声明和实现为何要放在头文件中
- 浅析dex文件加载机制
- Apache Conf/Vost/xx.conf 文件配置
- 依赖注入(DI)有助于应用对象之间的解耦,而面向切面编程(AOP)有助于横切关注点与所影响的对象之间的解耦(转good)
- 漫话JavaScript与异步&#183;第三话——Generator:化异步为同步
- protobuf 原理
- 早期Swift中Cocos2D初始化代码的重构
- SpringBoot拦截器中Bean无法注入(转)
- 二丶Django~1
- Ubuntu16.04环境下搭建基于三台主机的mysql galera cluster集群(实测有效)
- 简单的windows窗口创建实例
- 【leetcode】409. Longest Palindrome
- keepalived安装配置实战心得(实现高可用保证网络服务不间断)
热门文章
- <;a href
- 字节和unicode
- 大话设计模式--建造者模式 Builder -- C++实现实例
- javascript 数组 去重
- Nginx_学习_00_资源帖
- Linux-MySQL主从配置
- Hibernate - 配置c3p0
- Convolutional Neural Networks for Visual Recognition 7
- 【二叉查找树】05根据升序的链表构造二叉查找树【Convert Sorted List to Binary Search Tree】
- 使用 py2exe 打包 Python 程序