首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【C语言标准库函数】常用的内存&字符操作函数概览

【C语言标准库函数】常用的内存&字符操作函数概览

作者头像
byte轻骑兵
发布2026-01-20 16:44:03
发布2026-01-20 16:44:03
1030
举报

博主简介:byte轻骑兵,现就职于国内知名科技企业,专注于嵌入式系统研发。深耕 Android、Linux、RTOS、通信协议、AIoT、物联网及 C/C++ 等领域,乐于技术交流与分享。欢迎技术交流。 主页地址byte轻骑兵-CSDN博客 微信公众号:「嵌入式硬核研究所」 邮箱:byteqqb@163.com 声明:本文为「byte轻骑兵」原创文章,未经授权禁止任何形式转载。商业合作请联系作者授权。


在C语言中,内存操作是编程中非常基础且重要的一部分。C标准库提供了一系列用于内存操作的函数,这些函数允许程序员直接对内存进行读写、复制、分配和释放等操作。



一、 动态内存分配

1.1.malloc(size_t size)

1.2. calloc(size_t num, size_t size)

  • 分配一块足够大的内存以存储numsize大小的元素,并将所有位初始化为0。
  • 返回一个指向分配的内存的指针,如果分配失败,则返回NULL。
  • 相比于malloccalloc会进行内存初始化,因此在某些情况下可能会稍慢。
  • 详细讲解见:动态内存分配之二:calloc()函数详解-CSDN博客

1.3. realloc(void *ptr, size_t size)

  • 尝试改变之前通过malloccallocrealloc分配的内存块的大小。
  • 如果ptr是NULL,则realloc的行为与malloc相同。
  • 如果size是0,并且ptr不是NULL,则释放ptr指向的内存块,并返回NULL。
  • 如果成功,返回指向新内存块的指针(可能与原指针相同),如果失败,则返回NULL。
  • 详细讲解见:动态内存分配之三:realloc()函数详解-CSDN博客

1.4. free(void *ptr)

二、内存内容操作

2.1. memcmp()

功能:比较两个内存块的内容。

原型

代码语言:javascript
复制
int memcmp(const void *s1, const void *s2, size_t n);

参数

  • s1:指向要比较的第一个内存块的指针。
  • s2:指向要比较的第二个内存块的指针。
  • n:要比较的字节数。

返回值

  • 如果s1小于s2,则返回负值。
  • 如果s1等于s2,则返回0。
  • 如果s1大于s2,则返回正值。
  • 用途:用于检查两个内存块是否相等,或者一个内存块是否小于或大于另一个。

其详细讲解和介绍见内存内容操作之一:memcmp函数详解-CSDN博客

2.2. memcpy()

功能:从源内存地址复制n个字节的数据到目标内存地址。

原型

代码语言:javascript
复制
void *memcpy(void *dest, const void *src, size_t n);

参数

  • dest:目标内存地址,即要将数据复制到的位置。
  • src:源内存地址,即要复制数据的起始位置。
  • n:要复制的字节数。

返回值:返回目标内存地址dest的指针。

注意:源内存块和目标内存块不能重叠。

其详细讲解和介绍见内存内容操作之二:memcpy函数详解-CSDN博客

2.3. memmove()

功能:与memcpy()类似,但更安全,可以处理源内存块和目标内存块重叠的情况。

原型

代码语言:javascript
复制
void *memmove(void *dest, const void *src, size_t n);

参数:与memcpy()相同。

返回值:返回目标内存地址dest的指针。

注意:通过智能地调整复制方向(向前或向后),确保在内存块重叠时也能正确复制数据。

其详细讲解和介绍见:内存内容操作之三:memmove函数详解-CSDN博客

2.4. memset()

功能:将目标内存块的前n个字节设置为指定的值。

原型

代码语言:javascript
复制
void *memset(void *s, int c, size_t n);

参数

  • s:指向要设置的内存块的指针。
  • c:要设置的值(通常是一个字节的值,会被转换为unsigned char)。
  • n:要设置的字节数。

返回值:返回目标内存地址s的指针。

用途:常用于初始化内存块、清除内存等操作。

其详细讲解和介绍见:内存内容操作之四:memset函数详解-CSDN博客

2.5. memchr()

功能:在内存块中搜索首次出现的指定字符。

原型

代码语言:javascript
复制
void *memchr(const void *s, int c, size_t n);

参数

  • s:指向要被搜索的内存块的指针。
  • c:要搜索的字符(实际传递的是其ASCII值)。
  • n:要搜索的字节数。

返回值:如果找到指定字符,则返回指向该字符的指针;否则返回NULL

其详细介绍和讲解见:内存内容操作之五:memchr 函数详解-CSDN博客

三、字符串操作(涉及内存)

由于C语言本身不直接支持字符串类型,字符串通常是通过字符数组的形式来存储和处理的,并以空字符('\0')作为结束标志。以下是一些常用的C语言中涉及内存的字符串操作函数:

3.1. 字符串长度计算

3.2. 字符串复制

  • strcpy():将一个字符串复制到另一个字符串数组中,包括字符串结尾的空字符('\0')。这个函数也需要确保目标字符串数组有足够的空间来存储源字符串,否则可能会导致缓冲区溢出。
  • strncpy():与strcpy()类似,但它允许指定复制的最大字符数,有助于防止缓冲区溢出。
  • 其详细讲解和介绍见:字符串复制函数strcpy()和strncpy()详解-CSDN博客

3.3. 字符串连接

  • strcat():将两个字符串连接起来,即将源字符串追加到目标字符串的末尾,包括字符串结尾的空字符('\0')。同样,这个函数也需要确保目标字符串数组有足够的空间来存储两个字符串连接后的结果。
  • strncat():与strcat()类似,但允许指定追加的最大字符数。
  • 其详细讲解和介绍见:字符串连接函数strcat()和strncat()详解-CSDN博客

3.4. 字符串比较

  • strcmp():比较两个字符串是否相等。它按照字典顺序比较字符串中的字符,直到遇到不同的字符或遇到字符串的结尾。
  • strncmp():与strcmp()类似,但只比较字符串的前n个字符。
  • 其详细讲解和介绍见:字符串比较函数strcmp()和strncmp()详解-CSDN博客

3.5. 字符串查找

3.6. 字符串分割

3.7. 字符串与数值的转换

字符串与数值之间的转换主要通过标准库函数实现。这些函数定义在<stdlib.h>(对于整数和浮点数转换)和<stdio.h>(对于字符串的格式化输入输出,间接用于转换)中。下面是一些常用的字符串与数值转换函数。

①字符串转整数

  • atoi():将字符串转换为整型数(int)。这个函数没有错误检查,如果转换失败,它会返回0。
  • atol():将字符串转换为长整型数(long)。与atoi()类似,也没有错误检查。
  • strtol():将字符串转换为长整型数(long),并提供了错误检查机制。
  • strtoimax():将字符串转换为最大宽度的整数类型(intmax_t),提供了更广泛的整数范围和错误检查。
  • 字符串转整数函数atoi、atol、strtol和strtoimax详解-CSDN博客

②字符串转浮点数

  • atof():将字符串转换为双精度浮点数(double)。这个函数没有错误检查,如果转换失败,它会返回0.0。
  • strtod():将字符串转换为双精度浮点数(double),并提供了错误检查机制。
  • strtof():将字符串转换为单精度浮点数(float),并提供了错误检查机制。
  • strtold():将字符串转换为扩展精度的浮点数(long double),并提供了错误检查机制。
  • 字符串转浮点数函数atof、strtod、strtof和strtold详解-CSDN博客

③整数转字符串

  • sprintf():虽然sprintf()主要用于格式化输出到字符串,但它也可以用来将整数转换为字符串。通过指定格式说明符(如%d%ld%lld等),可以将整数转换为字符串。
  • snprintf():与sprintf()类似,但允许你指定目标字符串的大小,从而避免缓冲区溢出。
  • itoa():这不是C标准库的一部分,但在某些环境中可用,用于将整数转换为字符串。由于不是标准函数,其可用性和行为可能因编译器而异。
  • 整数转字符串itoa()详解-CSDN博客
  • 字符串格式化函数sprintf和snprintf的详解-CSDN博客

④浮点数转字符串

  • sprintf()snprintf():同样,这些函数也可以用于将浮点数转换为字符串,通过指定格式说明符(如%f%e%g等)。

⑤注意

  • 使用strtol()strtod()等函数时,应检查函数的返回值以及可能设置的errno值(如果可用),以检测转换错误。
  • 字符串到数值的转换函数(如atoi()atof())在转换失败时可能不会给出明确的错误指示,因此在使用时需要格外小心。
  • 数值到字符串的转换通常通过格式化输出函数(如sprintf())实现,这些函数提供了丰富的格式化选项。

3.8. 字符串格式化

  • sprintf():格式化输出并将结果存储到一个字符串中。这个函数可以生成格式化的字符串,类似于printf(),但结果不是输出到标准输出,而是存储到指定的字符串中。

3.9. 注意事项

  • 在使用上述函数时,需要包含相应的头文件,如<string.h><stdlib.h>
  • 字符串操作函数在处理字符串时,通常不会检查目标数组的大小,因此程序员需要确保目标数组有足够的空间来存储结果,以避免缓冲区溢出。
  • 对于动态分配的字符串,使用完毕后需要手动释放内存,以避免内存泄漏。

这些函数是C语言标准库中处理内存时最常用的函数。在使用这些函数时,务必注意内存泄漏、缓冲区溢出等安全问题。


本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-09-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、 动态内存分配
    • 1.1.malloc(size_t size)
    • 1.2. calloc(size_t num, size_t size)
    • 1.3. realloc(void *ptr, size_t size)
    • 1.4. free(void *ptr)
  • 二、内存内容操作
    • 2.1. memcmp()
    • 2.2. memcpy()
    • 2.3. memmove()
    • 2.4. memset()
    • 2.5. memchr()
  • 三、字符串操作(涉及内存)
    • 3.1. 字符串长度计算
    • 3.2. 字符串复制
    • 3.3. 字符串连接
    • 3.4. 字符串比较
    • 3.5. 字符串查找
    • 3.6. 字符串分割
    • 3.7. 字符串与数值的转换
    • 3.8. 字符串格式化
    • 3.9. 注意事项
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档