C语言内存管理函数

面试里会遇到让自己编写一个内存管理函数

1. memset 将指定的内存区域的每个字节设置为指定的值

 函数原型:

void *memset(void *s, int c, size_t n);
  • 参数:
    • s: 指向要填充的内存块的指针。
    • c: 要设置的值(会被转换为无符号字符)。
    • n: 要设置的字节数。
  • 用途: 常用于初始化数组或清空内存,例如将一个数组的所有元素设置为 0。
  • 示例:
int arr[5];  
memset(arr, 0, sizeof(arr));  // 将 arr 的所有元素设置为 0

 自己编写:

void *my_memset(void *s, int c, size_t n) {  unsigned char *p = s;        // 将 void* 转换为 unsigned char*  while (n--) {  *p++ = (unsigned char)c; // 设置每个字节  }  return s;                   // 返回原始指针  
}

2. memcpy 用于复制源内存到目标内存。

  • 函数原型:
    void *memcpy(void *dest, const void *src, size_t n);
  • 参数:
    • dest: 指向目标内存区域的指针(将数据复制到这里)。
    • src: 指向源内存区域的指针(从这里复制数据)。
    • n: 要复制的字节数。

示例

int src[5] = {1, 2, 3, 4, 5};  
int dest[5];  
memcpy(dest, src, sizeof(src));  // 将 src 的内容复制到 dest

自己编写 

void *my_memcpy(void *dest, const void *src, size_t n) {  unsigned char *d = dest;     // 目标指针  const unsigned char *s = src; // 源指针  while (n--) {  *d++ = *s++;            // 逐个字节复制  }  return dest;                // 返回目标指针  
}

3. memmove 用于从一个内存区域复制数据到另一个内存区域,支持内存重叠。

函数原型:

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

自己编写

void *my_memmove(void *dest, const void *src, size_t n) {  unsigned char *d = dest;  const unsigned char *s = src;  if (d < s) {  // 正常复制  while (n--) {  *d++ = *s++;  }  } else {  // 从后向前复制  d += n;  s += n;  while (n--) {  *(--d) = *(--s);  }  }  return dest;  
}

4. memcmp 比较两个内存块的内容。

int my_memcmp(const void *s1, const void *s2, size_t n) {  const unsigned char *p1 = s1;  const unsigned char *p2 = s2;  while (n--) {  if (*p1 != *p2) {  return *p1 - *p2; // 返回两个不同字节的差  }  p1++;  p2++;  }  return 0; // 相等  
}

5. malloc 会请求操作系统分配一定量的内存。一般实现比较复杂,这里给出一个非常简化的版本。

void *my_malloc(size_t size) {  void *ptr = sbrk(size); // 使用 sbrk 请求内存(仅用于示例,真实情况下更复杂)  return (ptr == (void *)-1) ? NULL : ptr; // 错误处理  
}

6. free 用于释放先前分配的内存。

void my_free(void *ptr) {  // 这里通常需要将指针返回内存管理系统  // 真实情况下,这需要维护一个内存块的链表或其他结构  
}

7. realloc 是调整动态内存块的大小,通常会先调用 malloc 和 memcpy

void *my_realloc(void *ptr, size_t size) {  if (ptr == NULL) {  return my_malloc(size); // 如果原指针为 NULL,分配新内存  }  // 获取原内存块的大小(具体实现中可能需要额外存储大小)  size_t old_size = /* ... */;  void *new_ptr = my_malloc(size);  if (new_ptr) {  my_memcpy(new_ptr, ptr, old_size < size ? old_size : size);  my_free(ptr); // 释放旧内存  }  return new_ptr; // 返回新指针  
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/891198.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年阿里云认证改版新消息!2025年阿里云认证考试内容有变!

阿里云认证已经确定在2025年要进行大改&#xff0c;这次改动幅度会比2023年改动更大&#xff0c;2023年主要改变是在考试题型上的变化&#xff0c;这次则主要是考试内容的变化了&#xff01; 2023年阿里云ACP认证考试的改版变化主要有&#xff1a; &#xff08;一&#xff09…

【Scala】图书项目系统代码演练3.1/BookService

package org.app package serviceimport models.{BookModel, BorrowRecordModel}import org.app.dao.{BookDAO, BorrowRecordDAO}import java.time.LocalDateTime import scala.collection.mutable.ListBuffer// 图书业务逻辑层 class BookService {private val bookDAO new B…

Ajax数据爬取

有时我们用requests 抓取页面得到的结果&#xff0c;可能和在浏览器中看到的不一样:在浏览器中可以看到正常显示的页面数据&#xff0c;而使用requests 得到的结果中并没有这些数据。这是因为 requests 获取的都是原始 HTML 文档&#xff0c;而浏览器中的页面是JavaScript 处理…

SpringCloud整合skywalking实现链路追踪和日志采集

1.部署skywalking https://blog.csdn.net/qq_40942490/article/details/144701194 2.添加依赖 <!-- 日志采集 --><dependency><groupId>org.apache.skywalking</groupId><artifactId>apm-toolkit-logback-1.x</artifactId><version&g…

12.30 Redis网络模型基础 IO NIO多路复用

图片引用自黑马程序员redis 网络模型 上图引用自java guide javaguide NIO

【智行安全】基于Synaptics SL1680的AI疲劳驾驶检测方案

随著车载技术的快速进步&#xff0c;驾驶安全越来越受到重视&#xff0c;而疲劳驾驶是造成交通事故的重要原因之一。传统的驾驶监控技术因精度不足或反应迟缓&#xff0c;无法满足实时监测需求。因此&#xff0c;结合人工智能技术的疲劳驾驶检测系统成为行业新方向&#xff0c;…

手机实时提取SIM卡打电话的信令声音-智能拨号器的SIP线路-双卡双待单通方案

手机实时提取SIM卡打电话的信令声音 --智能拨号器的SIP线路-双卡双待单通方案 一、前言 蓝牙电话的技术方案最初是从蓝牙耳机和车机蓝牙的使用领域延伸出来的技术方式。通过蓝牙的HFP协议&#xff0c;把手机通话的声音和通话事件状态提取出来进行复用和处理。但中国大陆现行…

HTML——26.像素单位

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>像素</title></head><body><!--像素&#xff1a;1.指设备屏幕上的一个点&#xff0c;单位px&#xff0c;如led屏上的小灯朱2.当屏幕分辨率固定时&…

LeetCode:513.找二叉树左下角的

跟着carl学算法&#xff0c;本系列博客仅做个人记录&#xff0c;建议大家都去看carl本人的博客&#xff0c;写的真的很好的&#xff01; 代码随想录 LeetCode&#xff1a;513.找二叉树左下角的 给定一个二叉树的 根节点 root&#xff0c;请找出该二叉树的 最底层 最左边 节点的…

如何使用 ChatGPT Prompts 写学术论文?

第 1 部分:学术写作之旅:使用 ChatGPT Prompts 进行学术写作的结构化指南 踏上学术写作过程的结构化旅程,每个 ChatGPT 提示都旨在解决特定方面,确保对您的主题进行全面探索。 制定研究问题: “制定一个关于量子计算的社会影响的研究问题,确保清晰并与您的研究目标保持一…

Mcnemar‘s exact test

与卡方检验的区别 与fisher exact test区别

全面Kafka监控方案:从配置到指标

文章目录 1.1.监控配置1.2.监控工具1.3.性能指标系统相关指标GC相关指标JVM相关指标Topic相关指标Broker相关指标 1.4.性能指标说明1.5.重要指标说明 1.1.监控配置 开启JMX服务端口&#xff1a;kafka基本分为broker、producer、consumer三个子项&#xff0c;每一项的启动都需要…

网络安全威胁2024年中报告

下载地址&#xff1a; 网络安全威胁2024年中报告-奇安信

AI辅助编码提高病案首页主要诊断编码正确率数据优化方法(2025增量优化版附python源代码)

一、引言 1.1 研究背景与意义 在医疗信息化进程中,病案首页作为病历信息的核心浓缩,承载着疾病分类、医疗统计、医保结算等关键任务,其主要诊断编码的准确性至关重要。准确的编码不仅是医疗质量评估、科研数据分析的基石,更是合理分配医疗资源、保障医保精准支付的关键依…

雷电模拟器安装LSPosed

雷电模拟器最新版支持LSPosed。记录一下安装过程 首先到官网下载并安装最新版&#xff0c;我安装的时候最新版是9.1.34.0&#xff0c;64位 然后开启root和系统文件读写 然后下载magisk-delta-6并安装 ,这个是吾爱破解论坛提供的&#xff0c;号称适配安卓7以上所有机型&#x…

模型 10-10-10旁观思维

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。超脱当下&#xff0c;透视决策长远影响。 1 10-10-10旁观思维的应用 1.1 职业选择决策 背景&#xff1a;小张是一名大学毕业生&#xff0c;面对未来职业的选择感到迷茫。他擅长营销、策略和经济学&a…

ORM框架详解:为什么不直接写SQL?

想象一下&#xff0c;你正在开发一个小型的在线书店应用。你需要存储书籍信息、用户数据和订单记录。作为一个初学者&#xff0c;你可能会想&#xff1a;“我已经学会了SQL&#xff0c;为什么还要使用ORM框架呢&#xff1f;直接写SQL语句不是更简单、更直接吗&#xff1f;” 如…

合合信息亮相CSIG AI可信论坛,全面拆解AI视觉内容安全的“终极防线”

合合信息亮相CSIG AI可信论坛&#xff0c;全面拆解视觉内容安全的“终极防线”&#xff01; &#x1f42f; AI伪造泛滥&#xff0c;我们还能相信“眼见为实”吗&#xff1f; 近期&#xff0c;由中国图象图形学学会主办的CSIG青年科学家会议 AI可信论坛在杭州成功举办。本次论…

Linux实验报告9-进程管理

目录 一&#xff1a;实验目的 二&#xff1a;实验内容 (1)列出当前系统中的所有进程,如何观察进程的优先级? (2)查看当前终端运行的 bash 进程的 PID,在当前终端启动 vim 编辑器并让其在后台执行,然后列出在当前终端中执行的进程的家族树。 (3)请自行挂载U盘或光盘,然后…

17爬虫:关于DrissionPage相关内容的学习01

概述 前面我们已经大致了解了selenium的用法&#xff0c;DerssionPage同selenium一样&#xff0c;也是一个基于Python的网页自动化工具。 DrissionPage既可以实现网页的自动化操作&#xff0c;也能够实现收发数据包&#xff0c;也可以把两者的功能合二为一。 DressionPage的…