C语言 编译预处理、typedef与动态储存分配

本文详细介绍了C语言中的编译预处理概念,包括宏定义、包含文件等预处理指令,以及如何使用typedef定义类型别名。此外,还深入探讨了动态存储分配,包括malloc、calloc、realloc和free函数的使用方法与注意事项。

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

本博文为半摘记性质。
——
声明:知识点引自《全国计算机等级考试-上机考试新版题库 二级C》,部分例程修改自https://www.runoob.com/cprogramming/c-tutorial.html 菜鸟教程,另有部分零散资料转自互联网,内容有一定改动,并非全文转载。
本人尊重各位的知识成果,大幅引用的文章原文网址已在各小节末尾给出。
——
C语言在线运行工具:http://c.jsrun.net/

编译预处理

编译预处理不属于C语言语句的范畴,相当于一个文本替换过程。
常用预处理指令:

#define	定义宏
#include	包含一个源代码文件
#undef	取消已定义的宏
#ifdef	如果宏已经定义,则返回真
#ifndef	如果宏没有定义,则返回真
#if	    如果给定条件为真,则编译下面代码
#else	#if 的替代方案
#elif	如果前面的 #if 给定条件不为真,当前条件为真,则编译下面代码
#endif	结束一个 #if……#else 条件编译块
#error	当遇到标准错误时,输出错误消息
#pragma	使用标准化方法,向编译器发布特殊的命令到编译器中

typedef

C语言允许用户自行定义类型说明符,即可以自行为原有的数据类型取别名(并没有生成新的数据类型),该功能是通过typedef实现的,其具体形式为:

typedef 系统已存在的数据类型 标识符
例:typedef unsigned char uchar;

可以对结构体使用 typedef 来定义一个新的数据类型名字,然后使用这个新的数据类型来直接定义结构变量:

typedef struct Books
{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
} Book;

int main( )
{
   Book book = {“霞”,“佚名”,“文学”,“5874};//此时的结构体成员赋值
   ...
}

对比:

  struct Books
{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
} ;
int main( )
{
struct Books book = {...};
   ...
}

https://www.cnblogs.com/ktao/p/8578074.html typedef

1动态存储分配

动态内存分配指在程序运行中实时申请内存分配,通常用于预先不知道需要存储的文本长度的情况下;申请到的内存不用时必须及时释放,以防内存资源枯竭。

常见动态分配函数

1.malloc函数(常用)

void *malloc(unsigned int size);

函数类型为 void * 。
其功能为在内存的动态存储去中分配一个长度为size的连续存储空间(字节个数)。
函数返回值为一个指针,它指向所分配存储空间的起始地址。返回值为NULL时表示未能成功申请到内存空间。
malloc不能初始化所分配的内存空间。

2.calloc函数

void *calloc(unsigned int n,unsigned int size);

其功能为在内存的动态存储去中分配n个长度为size的连续存储空间(字节个数)。
函数返回值为一个指针,它指向所分配存储空间的起始地址。返回值为NULL时表示未能成功申请到内存空间。
calloc可将申请到的存储空间初始化为0,但这将降低效率。

3.realloc函数

void *realloc(void *ptr, int newsize); 

该函数为ptr重新分配内存,把内存扩展到 newsize。
当扩大时,这块内存原先的内容会依旧保留,新添加的加入到原先的后面;缩小时,该内存的尾部部分内存去掉,剩余保留。
注意:如果ptr是NULL,此时 realloc 就相当于 malloc 函数;如果ptr不为NULL,size=0,那么 realloc 就相当于 free函数;如果 ptr 不为 NULL,那么 ptr 必须是之前 malloc,calloc,realloc 函数返回的指针,不能任意指定。

4.free函数

void free(void *ptr)

其功能为释放由指针变量ptr所指示的内存区域。ptr指向最近一次调用函数malloc或calloc时所分配的连续存储空间的首地址。

请注意:
1.由于内存分配并不总是成功,每次调用动态分配函数时需检查返回的指针值是否为NULL。
2. 动态内存使用后应及时释放。
3. 在具体使用中,可以将动态分配函数的返回值转换为特定指针类型,例如:

char *description = (char *)malloc( 30 * sizeof(char) );

案例

在这里,我们需要定义一个指针,该指针指向未定义所需内存大小的字符,后续再根据需求来分配内存,如下所示:

#include <stdlib.h>

int main()
{
   char name[100];
   char *description;
 
   strcpy(name, "Zara Ali");
 
   /* 动态分配内存 */
   description = (char *)malloc( 30 * sizeof(char) );
   if( description == NULL )
   {
      fprintf(stderr, "Error - unable to allocate required memory\n");
   }
   else
   {
      strcpy( description, "Zara ali a DPS student.");
   }
   /* 假设您想要存储更大的描述信息 */
   description = (char *) realloc( description, 100 * sizeof(char) );
   if( description == NULL )
   {
      fprintf(stderr, "Error - unable to allocate required memory\n");
   }
   else
   {
      strcat( description, "She is in class 10th");
   }
   
   printf("Name = %s\n", name );
   printf("Description: %s\n", description );
 
   /* 使用 free() 函数释放内存 */
   free(description);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值