C语言预处理和内存管理

本文介绍了C语言的预处理功能,包括宏定义、文件包含、条件编译等预处理器指令,以及预定义宏。同时,文章详细阐述了C语言的内存管理,如栈区、堆区、全局区和代码区的划分,并列举了内存管理函数如calloc、malloc、free和realloc的作用。此外,还提及了内存操作函数memset和memcpy。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

预处理(或称预编译)是指在进行编译的第一遍扫描(词法扫描和语法分析)之前所作的工作。预处理指令指示在程序正式编译前就由编译器进行的操作,可放在程序中任何位置。
预处理是C语言的一个重要功能,它由预处理程序负责完成。当对一个源文件进行编译时,系统将自动引用预处 理程序对源程序中的预处理部分作处理,处理完毕自动进入对源程序的编译。 C语言提供多种预处理功能,主要处理#开始的预编译指令,如宏定义(#define)、文件包含(#include)、条 件编译(#ifdef)等。合理使用预处理功能编写的程序便于阅读、修改、移植和调试,也有利于模块化程序设 计。
常见的预处理器指令:
#define 定义宏
#include 包含一个源代码文件
#undef 取消已定义的宏
#ifdef 如果宏已经定义,则返回真
#ifndef 如果宏没有定义,则返回真
#if 如果给定条件为真,则编译下面代码
#else #if 的替代方案
#elif 如果前面的 #if 给定条件不为真,当前条件为真,则编译下面代码
#endif 结束一个 #if……#else 条件编译块
#error 当遇到标准错误时,输出错误消息
#pragma 使用标准化方法,向编译器发布特殊的命令到编译器中

常见的预定义宏
DATE 当前日期,一个以 “MMM DD YYYY” 格式表示的字符常量。
TIME 当前时间,一个以 “HH:MM:SS” 格式表示的字符常量。
FILE 这会包含当前文件名,一个字符串常量。
LINE 这会包含当前行号,一个十进制常量。

C语言的内存管理
在C语言中把内存分为四个区域:栈区、堆区、全局区、代码区
栈区:由编译器自动分配释放,存放函数的形参、局部变量等。当函数执行完毕时自动释放。
堆区:动态内存申请与释放,若不释放会造成程序内存泄漏,使用时间越久占用内存越多,最后导致程序崩溃。
全局区:用于存放全局变量和静态变量, 里面细分有一个常量区,字符串常量和其他常量也存放在此。
代码区:程序代码放置的区域
在实际使用过程中,我们有时候需要动态的去分配内存,此时就会使用到C语言中的内存管理函数。
如下表所示,这些函数都包含在头文件<stdlib.h>中。

内存管理函数:
①void calloc(int num, int size);
在内存中动态地分配 num 个长度为 size 的连续空间,并将每一个字节都初始化为 0。所以它的结果是分配了 num
size 个字节长度的内存空间,并且每个字节的值都是0。

②void free(void *address);
该函数释放 address 所指向的内存块,释放的是动态分配的内存空间。

③void *malloc(int num);
在堆区分配一块指定大小的内存空间,用来存放数据。这块内存空间在函数执行完成后不会被初始化,它们的值是未知的。

④void *realloc(void *address, int newsize);
该函数重新分配内存,把内存扩展到 newsize。

内存操作函数(string.h头文件中):
①void *memset(void *str, int c, size_t n)
复制字符 c(一个无符号字符)到参数 str 所指向的字符串的前 n 个字符。
②void *memcpy(void *dest, const void *src, size_t n)
从 src 复制 n 个字符到 dest。

注意:void * 类型表示未确定类型的指针。C、C++ 规定 void * 类型可以通过类型转换强制转换为任何其它类型的指针。

动态申请内存一般有以下几个步骤:
a.声明一个指针,用来存储动态申请内存的首地址。
b.调用内存申请函数,获取指定长度的内存。
c.通过指针读写内存
d.使用结束之后调用内存释放函数释放内存。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值