C 常用库函数memset,编译器宏定义assert

一、 总览

1.1库函数

函数名 头文件 功能 原型 说明
syslog syslog.h 记录至系统记录(日志) void    syslog(int, const char *, ...) __printflike(2, 3) 参数1:优先级,参数2:要输出到系统日志的 参数3:(格式化)字符串
perror stdio.h 将上个函数错误原因输出至stderr void     perror(const char *) 参数:要优先打印到stderr的字符串
memset

 string.h

/memory.h

 将指定内存区域全部设置为默认ASCII码值 void    *memset(void *, int, size_t)

参数1:指定内存块指针

参数2:字符ASCII码

参数3:要初始化的内存前n个字节数

 bzero strings.h

置字符串前n个字节=0,且包括'\0' ,

已被舍弃,由memset取代;

类似的有bcopy,bcmp等

void     bzero(void *, size_t)

参数1: 指定内存块指针

参数2: 要初始化为0的内存前n个字节

abort stdlib.h 引发程序不正常终止

void     abort(void) __dead2

#define __dead2        __attribute__((noreturn))

无参数

__attribute__((noreturn)) 表示希望自定义有返回值函数不想返回值

         
 宏定义  头文件  功能  原型  说明
 assert  assert.h

 断言,用于调试时判断表达式是否通过验证

(真:通过;假:未通过)


#define assert(e)  \
    ((void) ((e) ? ((void)0) : __assert (#e, __FILE__, __LINE__)))
#define __assert(e, file, line) \
    ((void)printf ("%s:%u: failed assertion `%s'\n", file, line, e), abort())

e:表达式的值

__FILE__:文件名

__LINE__:当前代码行号

         
         
         

 

 

1.2宏定义

1)几个ANSI C标准定义的编译器内置宏

__LINE__:在源代码中插入当前源代码行号;
__FILE__:在源文件中插入当前源文件名;
__DATE__:在源文件中插入当前的编译日期
__TIME__:在源文件中插入当前编译时间;
__STDC__:当要求程序严格遵循ANSI C标准时该标识被赋值为1;
__cplusplus:当编写C++程序时该标识符被定义。

 

 

2.函数实现源码

2.1 memset 常用于内存空间初始化

复制代码
 1 /**
 2  *
 3  * 原型:void *memset(void *buffer, int c, int count);
 4  * 头文件:string.h 或memory.h
 5  * 功能:把buffer所指内存区域的前count个字节设置成字符c
 6  * 参数: buffer 要设置值的内存区域首地址指针
 7  *      c 字符ASCII码
 8  *      count 内存区域字节数
 9  * 返回值: 置成字符c后的内存区域首地址指针
10  * 说明:返回指向buffer的指针。
11  */
12 void *memset(void *src, int c, size_t count)
13 {
14     assert(src != NULL);
15     char *tmpSrc = (char *)src;
16     while (count --) {
17         *tmpSrc =(char)c;
18         tmpSrc ++;
19     }
20     return src;
21 }
复制代码

 e.g 使用,如初始化一个结构体

复制代码
struct Grade
{
    char name[30];
    int score;
};

struct Student
{
    uint16_t id;
    char name[20];
    char sex;
    struct Grade grade;
};

//初始化 
void init(){
    struct Student student;//开辟内存空间
    memset((void*)&student, 0, sizeof(struct Student));//结构体student所指向内存空间全部=(char)0//开辟内存空间
}
复制代码

 

本文作者:明明1109

本文链接:https://www.cnblogs.com/fortunely/p/4883937.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   明明1109  阅读(837)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起
  1. 1 404 not found REOL
404 not found - REOL
00:00 / 00:00
An audio error has occurred.