<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
<c和指针>学习笔记5动态内存分配和预处理器的更多相关文章
- C++学习笔记(十一):void*指针、类型转换和动态内存分配
void*指针 void关键字表示“空类型”的概念.但是,这里的“空类型”不表示“任意类型”,而是表示不存在的意思,也就是说C/C++不允许你写语句void a,不存在类型为void的东西. void ...
- C和指针 第十一章 动态内存分配
声明数组时,必须指定数组长度,才可以编译,但是如果需要在运行时,指定数组的长度的话,那么就需要动态的分配内存. C函数库stdlib.h提供了两个函数,malloc和free,分别用于执行动态内存分配 ...
- C和C指针小记(十六)-动态内存分配
动态内存分配 1.1 为什么使用动态内存分配 直接声明数组的方式的缺点: 1) 声明数组必须指定长度限制.无法处理超过声明长度的数组. 2) 如果声明更大的常量来弥补第一个缺点,会造成更多的内存浪费. ...
- 深入理解C指针----学习笔记
深入理解C指针 第1章 认识指针 理解指针的关键在于理解C程序如何管理内存,指针包含的就是内存地址. 1.1 指针和内存 C程序在编译后,以三种方式使用内存: 1. 静态. ...
- C++的智能指针学习笔记(初)
C++ primer plus 16.2节介绍了auto_ptr,该模板类在C++11中已弃用,目前已被shared_ptr代替. auto_ptr又叫做智能指针,用于管理动态内存分配的用法. 为什么 ...
- C++学习 之 指针及动态内存分配(笔记)
1. 指针 1.1 指针的含义: 简单来说,指针是存储内存地址的变量.当我们声明了一个指针变量后,使用该指针时系统会根据指针内的地址索引内存块,读取内存内的值.指针因为是用来存地址的,所以一般固定长度 ...
- [C++学习笔记14]动态创建对象(定义静态方法实现在map查找具体类名对应的创建函数,并返回函数指针,map真是一个万能类)good
[C++学习笔记14]动态创建对象 C#/Java中的反射机制 动态获取类型信息(方法与属性) 动态创建对象 动态调用对象的方法 动态操作对象的属性 前提:需要给每个类添加元数据 动态创建对象 实 ...
- 《C和指针》 读书笔记 -- 第11章 动态内存分配
1.C函数库提供了两个函数,malloc和free,分别用于执行动态内存分配和释放,这些函数维护一个可用内存池. void *malloc(size_t size);//返回指向分配的内存块起始位置的 ...
- C语言学习笔记--动态内存分配
1. 动态内存分配的意义 (1)C 语言中的一切操作都是基于内存的. (2)变量和数组都是内存的别名. ①内存分配由编译器在编译期间决定 ②定义数组的时候必须指定数组长度 ③数组长度是在编译期就必须确 ...
随机推荐
- python 3 递归调用与二分法
递归调用与二分法 1.递归调用 递归调用:在调用一个函数的过程中,直接或间接地调用了函数本身. 示例: def age(n): if n == 1: return 18 # 结束条件 return a ...
- 第二篇 javascript一维数组和二维数组及方法
一.数组 什么是数组 程序=数据+算法 数组就是一种很常见的保存批量数据的数据结构 一.定义数组 var arr1=[]; //定义了一个不包含元素的数组 ,,]; //定义了一个包含三个元素的数组 ...
- centos web+mysql服务器的安全
今天闲来无事,拿来X-Scan-v3.3 来扫描自己的服务器,开放端口有22,80,443,3306:3306端口被扫出来,呵呵,那可不得了: 一,屏蔽扫描器扫出3306端口,因为web和数据库是在同 ...
- JFreeChart插件
JFreeChart的核心对象. 1. 制图对象 JFreeChart的类是制图对象.常用方法: 方法 说明 Void setAntiAlias(Boolean flag) 设置字体边界模糊 Void ...
- pyqt5开发之俄罗斯方块
#!/usr/bin/python3 # -*- coding: utf-8 -*- """ ZetCode PyQt5 tutorial This is a Tetri ...
- 前端多媒体(7)—— 在浏览器中实现rtmp推流
示例:https://young-cowboy.github.io/gallery/rtmp_client/index.html 在国内的直播场景中通常使用,rtmp协议作为推流协议.RTMP是Rea ...
- Android 内存监测工具 DDMS --> Heap
用 Heap监测应用进程使用内存情况的步骤如下: 1. 启动eclipse后,切换到DDMS透视图,并确认Devices视图.Heap视图都是打开的: 2. 将手机通过USB链接至电脑,链接时需要确认 ...
- Skype SILK vs. iLBC vs. Speex
对比一下这三种VOIP语音算法的特点: 1 参数与特征 2 SILK性能 关于iLBC和Speex的性能可以参考以前写的文章. 3 关于VOIP一些观点(仅代表个人观点) 1) Skype 辛苦三年 ...
- L2-016 愿天下有情人都是失散多年的兄妹(25 分)
呵呵.大家都知道五服以内不得通婚,即两个人最近的共同祖先如果在五代以内(即本人.父母.祖父母.曾祖父母.高祖父母)则不可通婚.本题就请你帮助一对有情人判断一下,他们究竟是否可以成婚? 输入格式: 输入 ...
- 使用Visual Studio进行单元测试-Part3
本文主要介绍Visual Studio(2012+)单元测试框架的一些技巧: 测试覆盖率的统计 测试分组 测试Setup/TearDown 测试调试 Exception测试 代码覆盖率的统计 VS下面 ...