当前位置: 首页 > news >正文

C语言基础第18天:内存操作函数

内存操作

常用函数

内存填充

头文件:

#include <string.h>
函数原型:
void* memset(void* s, int c, size_t n);

函数功能:将内存块 s 的前 n 个字节填充为 c ,一般用于初始化或者清零操作。

参数说明:

        s :目标内存首地址。

        c :填充值(以 unsigned char 形式处理(0~255))。

        n :填充字节数。

返回值:

        成功:返回 s 的指针。

        失败:返回NULL。

注意事项:

        常用于动态初始化, c 通常设置为0(清零)。

        按字节填充,非整型初始化需要谨慎(如填充 int 数组时,0是安全的)。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>#define LEN 4int main(){// 在堆内存申请4个int的连续空间int *p = (int*)malloc(LEN * sizeof(int));// 非空校验if (!p){perror("内存申请失败!");return -1;}// 初始化堆内存空间,填充0,我们也可以称作清零操作memset(p, 0, LEN * sizeof(int));// 测试输出printf("%d,%d\n", p[1], *(p+1));// 释放内存free(p); // 等价于 realloc(p,0);// 对指针置空,防止空悬指针p = NULL;return 0;
}

内存拷贝

头文件:

#include <string.h>

函数原型:

        源与目标内存无重叠时使用:

void* memcpy(void* dest, const void* src, size_t n);

        安全处理内存重叠:

void* memmove(void* dest, const void* src, size_t n);

函数功能:src 的前 n 个字节拷贝到 dest。

参数说明:

        dest :目标内存首地址,支持指针偏移。

        src :源内存首地址,支持指针偏移。

        size_t n :拷贝的字节数。

返回值:

        成功:返回 dest 的首地址。

        失败:返回NULL。

注意事项:

        memmove 能正确处理内存重叠,推荐优先使用。

        确保目标内存足够大,避免溢出。

#include <stdio.h>
#include <string.h>int main()
{// 准备两个数组,用来存储源和目标int src[4] = {11,22,33,44};// 拷贝 22,33 从src+1开始,拷贝2个 sizeof(int)int dest[6] = {111,222,333,444,555,666};// 目的地 dest+1,拷贝后:111,22,33,444,555,666register int i = 0;printf("拷贝前:");for (i = 0 ; i < 6 ; i++){printf("%-6d", dest[i]);}// 进行拷贝memmove(dest + 1, src + 1, 2 * sizeof(int));printf("\n拷贝后:");for (i = 0 ; i < 6 ; i++){printf("%-6d", dest[i]);}printf("\n");return 0;
}

内存比较

头文件:

#include <string.h>

函数原型:

int memcmp(const void* s1, const void* s2, size_t n);

函数功能:比较 s1 s2 的前 n 个字节。

返回值:

        0 :内存内容相同。

        > 0 s1 中第一个不同字节大于 s2。

        < 0 s1 中第一个不同字节小于 s2。

注意事项:比较按字节进行,非字符串需确保长度一致(总字节数一致)。

#include <stdio.h>
#include <string.h>int main()
{// 准备两个测试用的数组int src[] = {111, 22, 33, 44};int dest[] = {111, 22, 10, 44, 555, 666};// 进行比较int result = memcmp(src, dest, 4 * sizeof(int));printf("%d 与 %d 的比较结果是 %d\n",*src, *dest, result);return 0;
}

内存查找

头文件:

#include <string.h>

函数原型:

正向查找,C语言标准库函数:

void* memchr(const void* s, int c, size_t n);

逆向查找,这个不是C语言标准库函数,属于GNU扩展:

void* memrchr(const void* s, int c, size_t n);

函数功能:s 的前 n 个字节中查找字符 c。

返回值:

        成功:返回找到内容对应的地址

        失败:返回NULL

注意事项:

        memrchr GNU扩展函数,需手动声明(只要不是C语言标准提供,编译的时候都需要手动声明或链接)。

        查找单位为字节值,非整型数据需要注意内存布局。

#include <stdio.h>
#include <string.h>int main(int argc, char *argv[])
{// 准备一个测试数组char str[] = {'A','B','C','B'};// 查找字符 Bchar* first = (char*)memchr(str, 'B', sizeof(str)); // 返回 低地址对应的字符地址char* last = (char*)memrchr(str, 'B', sizeof(str)); // GNU扩展函数,返回 高地址对应的字符地址printf("first = %p,last = %p\n", first, last);//first = 0x7fff65a47875,last = 0x7fff65a47877printf("第 1 个 B 的位置:%ld\n", first - str);// 1printf("最后 1 个 B 的位置:%ld\n", last - str);// 3return 0;
}
http://www.dtcms.com/a/308621.html

相关文章:

  • Jmeter 性能测试常用图表、服务器资源监控
  • AI学习笔记三十四:基于yolov5+deepsort+slowfast的视频实时行为检测测试
  • 【源力觉醒 创作者计划】文心大模型4.5体验:技术跃迁,拥抱AI新时代
  • Coze是什么?能做什么?
  • MySQL 9 INNODB Cluster部署
  • Qt之CJSON:从基础到进阶的 JSON 数据处理指南
  • MySQL 8.0 OCP 1Z0-908 题目解析(41)
  • 节目预告:工程师张仰彪在相对论学习中的九个疑问
  • 【Kubernetes 指南】基础入门——Kubernetes 集群(一)
  • python每日一题练习---简单题目
  • 基于STM32设计的景区便民服务系统(NBIOT)_261
  • IDEA识别lombok注解问题
  • MySQL常用命令完整指南
  • systmctl的作用,使用场景和用法
  • 硬件-音频学习DAY1——音箱材料选择:密度板为何完胜实木
  • 动手学习深度学习-深度学习知识大纲
  • 云迁移技术深度解析:核心原理与最佳实践
  • Python删除字符串的3种高效方法
  • Spring Boot + MinIO + KKFile:三步搭建企业级文件预览系统
  • Mysql索引失效问题及其原因
  • 【Leetcode】2683. 相邻值的按位异或
  • 五、cv::SparseMat的介绍和使用
  • 是采用示例模板,还是采用json的结构化数据,哪种方式会让llm的输出更加稳定?
  • 查询目前服务器所占的带宽的命令(上传和下载)
  • CNN卷积神经网络之LeNet和AlexNet经典网络模型(三)
  • c语言的编译链接
  • Winform PathGradientBrush类使用
  • C#程序本地运行正常,通过网络下载报错:FileLoadException:“未能加载文件或程序集“xxx.dll”或它的某一个依赖项。
  • 【pycharm的使用】
  • Qwen3-30B-A3B-Thinking-2507 推理模型深度评测