C语言内存函数与数据在内存中的存储

news2025/5/19 11:26:32

一、c语言内存函数

1、memcpy函数是一个标准库函数,用于内存复制。功能上是用来将一块内存中的内容复制到另一块内存中。用户需要提供目标地址源地址以及要复制的字节数。例如结构体之间的复制。

memcpy函数的原型是:void* memcpy(void* dest,const void* src,size_t num)这里dest是目标指针、src是源指针,num是要复制的字节数。需要注意的是:src指向的内容在复制过程中不会被修改,所以用const修饰。

注意事项:

  1. 调用memcpy前需确保源内存与目标内存区域无重叠,否则应使用 memmove
  2. 目标缓冲区大小应足够容纳拷贝数据,防止发生缓冲区溢出
  3. 第三个参数表示拷贝的字节数,建议使用 sizeof 运算符进行计算
  4. 处理结构体或包含指针的数据时,需注意浅拷贝可能导致的问题
  5. 源指针和目标指针必须为有效指针,禁止传入空指针

注:strcpy只针对字符串,memcpy不在乎内存中存放什么数据,

#include<stdio.h>
#include<string.h>
int main()
{
	char src[] = "hello";
	char dest[10] = { 0 };
	memcpy(dest, src, sizeof(src));
	printf("%s\n", dest);
	return 0;
}

2、memmove函数(可以处理不重叠的情况)

void* memmove(void* dest,const void* src,size_t num),用户需要提供目标地址源地址以及要复制的字节数。这里dest是目标指针、src是源指针,num是要复制的字节数。需要注意的是:src指向的内容在复制过程中不会被修改,所以用const修饰。

#include<stdio.h>
#include<string.h>
int main()
{
	
	char str[] = "abcdefgh";
	//源和目标重叠,将从下标2的位置开始,复制5个字符到下标为4的位置
	memmove(str + 4, str + 2, sizeof(str));
	printf("%s\n", str);
	return 0;
}

3、memset内存设置函数

void* memset( void* ptr ,int value,size_t num),value是设置的值,ptr指向被填充的内存块,num是要修改的字节数。(将内存中的值以字节为单位设置成想要的内容;只能改字节,不能改元素)

int main()
{
	char str[] = "Hello,world";
	memset(str, '6', 5 * sizeof(char));
	printf("%s\n", str);
	return 0;
}

4、memcmp函数(内存比较)

int memcmp(const void* ptr1,const void* ptr2,size_t num),比较从ptr1和ptr2指针指向的位置开始向后的num个字节的内容,如果俩个内存的内容完全相同,函数返回0;若ptr1所指向的内存区域在字典序上小于ptr2所指向的内存区域,函数返回一个小于0的值;如果ptr1所指向的内存区域在字典序上大于ptr2所指向的内存区域,函数返回一个大于0的值。使用方法如下:

int main()
{
	char str1[] = "abcdefgz";
	char str2[] = "abcdefgj";
	int end=memcmp(str1, str2,8);
	printf("%d", end);
	return 0;

二、整型数据在内存中的存储

1、对于整形数组是来说:数据存放是放在内存中其实存放的是二进制的补码,在输出时要将补码换为原码!

2、大小端储存方式

(1)大端储存方式:数据的低位字节内容保存在内存的高地址位,而数据的高位字节内容,保存在内存的低地址处。

(2)小端储存方式:数据的低位字节内容保存在内存的低地址处,而数据的高位字节内容保存在内存的高地址处。

三、浮点数在内存中的存储

任意一个二进制浮点数V可以表示成这种形式:V=(-1)^s*M*2^E,先将浮点数转换成二进制;(-1)^s表示符号位,s=0,V为正数,当s=1时,V为负数,M表示有效数字,M是大于等于1小于2的,2^E表示指数位。

先将浮点数转换为二进制。

对于32位的浮点数·(float),最高的1位存储符号位S,接着的8位存储指数E,剩下的23位存储有效数字M。

对于double类型的浮点数内存分配(8字节,64比特),存储方式符下:

在保存时M可以写成1.xxxxx的形式,其xxxxx表示小数部分。IEEE754规定在计算机内部保存M时,默认这个数第一位总是1,因此可以被消去。只保留1后的xxxxx部分就可以了,eg.1.01保存时只需要保存01,等读取时再把第一位加上,这样做是节省一位有效数字。

E是无符号整数,E为8位,它的取值范围是0-->255;如果E为11位,它的值为0-->2047.

科学计数法中E可以为负数,所以IEEE754规定,存入内存时E的真实值必须再加一个中间数,对于8为E,这个数是127;对于E是11位时,这个中间数是1023。

比如:2^10的E是10,所以保存为32位浮点数时,必须保存成10+127=137

即:10001001

E真实值+127/1023=E的存储值

浮点数取的过程中:

(1)E不全为0或者不全为1(常规情况)

0.5的二进制形式是0.1,规定有效数字部分必须为1,就是1.0*2^(-1),其阶码为-1+127=126(表示为:01111110),而尾数1.0去掉整部分后为0,补齐0到23位。如下图:以float储存为例:

(2)E全为0,此时浮点数的指数E(真实值)=1-127/1023,有效数字M不再加上第一位的1,而是还原为0.xxxxx的小数,这是表示正负0,以及接近0的很小的数字。

(3)E全为1,如果有效数字M全为0,表示正负无穷大。(正负取决于符号位S)

注:IEEE754是浮点数表示的标准

如有不足之处,请大家指出,谢谢!!!

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

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

相关文章

通过MCP让LLM调用系统接口

场景 MCP的出现大大丰富了LLM的功能&#xff0c;对于存量系统&#xff0c;我们希望能让模型调用已有的接口&#xff0c;以最小的成本让AI能够获取系统内部数据。因此我们开发了一个名为http-api-call的MCP Server&#xff0c;来支持模型到内部API的调用 实现方案 使用用标准…

【刚下赛场!】2025年江西省电子专题赛 - 现场制作:简易数控直流电流源原题

一、题目要求 二、赛场注意事项 1、一定要用铜柱将板子升起来&#xff0c;不然我们剪下来的引脚在测试的时候放在桌子上非常容易导致我们的板子短路&#xff08;记得把铜柱卸下来再上交作品&#xff0c;不然会被认为是做标记判0分&#xff09;&#xff1b; 2、发下来器件之后…

材料×工艺×AI:猎板PCB重构汽车电子四层板技术逻辑

一、汽车电子四层板的三大核心挑战 1. 极端环境下的可靠性保障 汽车电子需在-40℃至150℃的剧烈温变、高湿振动等环境中稳定运行。例如&#xff0c;电池管理系统&#xff08;BMS&#xff09;要求PCB在高温下阻抗漂移率低于8%&#xff0c;且镀层需具备抗腐蚀能力。猎板PCB通…

MCP(一)——QuickStart

目录 1. MCP简介2. MCP的优势3. MCP核心4. QuickStart For Server Developers(仅具参考)4.1 MCP核心概念4.2 构建MCP服务器的代码4.2.1 设置MCP服务器实例4.2.2 辅助函数4.2.3 实现工具执行4.2.4 在Cherry-Studio中添加MCP服务器4.2.5 演示4.2.5.1 测试工具get_alerts4.2.5.2 测…

Spring AOP从0到1

Spring有两大核心&#xff1a; 1、IoC 控制反转 2、AOP 面向切面编程 AOP&#xff1a;切面就是指某⼀类特定问题, 所以AOP也可以理解为面向特定⽅法编程. 引入AOP依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spri…

软考IPSEC案例分析

要回忆IPSEC点击这里 题目 5/21 某全国连锁企业的总部和分布在全国各地的30家分公司之间经常需要传输各种内部数据&#xff0c;因此公司决定在总部和各分公司之间建立VPN技术。具体拓扑如下&#xff1a; 配置部分只显示了与总部与分公司1的配置。 根据拓扑完成问题1-问题2。…

C++(23):容器类<vector>

目录 一、核心概念 二、基本语法 1. 头文件 2. 声明与初始化 三、常用操作 四、具体实例 1、size()、front()、back() 2、push_back()、pop_back()、capacity() 3、reserve&#xff08;&#xff09; 一、核心概念 Vectors 包含着一系列连续存储的元素,其行为…

Hugo 安装保姆级教程(搭建个人blog)

Hogo 安装保姆级教程 友链 参考文章&#xff1a; https://blog.csdn.net/xianyun_0355/article/details/140261279 前言 Hugo 是 Go 编写的静态网站生成器&#xff0c;速度快&#xff0c;易用&#xff0c;可配置。作为一款跨平台开源建站系统&#xff0c;当前提供 Windows&…

tomcat查看状态页及调优信息

准备工作 先准备一台已经安装好tomcat的虚拟机&#xff0c;tomcat默认是状态页是默认被禁用的 1.添加授权用户 vim /usr/local/tomcat/conf/tomcat-users.xml22 <role rolename"manager-gui"/>23 <user username"admin" password"tomcat&q…

从坏道扫描到错误修复:HD Tune实战指南

一、硬盘检测的必要性 随着计算机使用时间的增加&#xff0c;机械硬盘和固态硬盘都会出现不同程度的性能衰减。定期进行硬盘健康检查可以&#xff1a;及时发现潜在故障&#xff1b;预防数据丢失风险&#xff1b;掌握存储设备实际状态。 二、HD Tune功能解析 性能测试&#x…

将嵌入映射到 Elasticsearch 字段类型:semantic_text、dense_vector、sparse_vector

作者&#xff1a; Andre Luiz 讨论如何以及何时使用 semantic_text、dense_vector 或 sparse_vector&#xff0c;以及它们与嵌入生成的关系。 通过这个自定进度的 Search AI 实践学习亲自体验向量搜索。你可以开始免费云试用&#xff0c;或者在本地机器上尝试 Elastic。 多年来…

解决uni-app开发中的“TypeError: Cannot read property ‘0‘ of undefined“问题

问题背景 在使用uni-app开发小程序或App时&#xff0c;你可能会遇到这样一个错误: TypeError: Cannot read property 0 of undefinedat uni.promisify.adaptor.js:7这个错误看起来很唬人&#xff0c;但它实际上与uni-app框架中的Promise适配器有关。今天&#xff0c;我们将深…

翻译:20250518

翻译题 文章目录 翻译题一带一路中国结 一带一路 The “One Belt and One Road” Initiative aims to achieve win-win and shared development. China remains unchanged in its commitment to foster partnerships. China pursues an independent foreign policy of peace, …

西门子1200/1500博图(TIA Portal)寻址方式详解

西门子博图&#xff08;TIA Portal&#xff09;是西门子公司推出的自动化工程软件平台&#xff0c;广泛应用于工业自动化领域。在编写PLC程序时&#xff0c;寻址方式是一个非常重要的概念&#xff0c;它决定了如何访问和操作PLC中的数据和资源。本文将详细介绍西门子博图中的寻…

记录一次win11本地部署deepseek的过程

20250518 win11 docker安装部署 ollama安装 ragflow部署 deepseek部署 文章目录 1 部署Ollama下载安装ollama配置环境变量通过ollama下载模型deepseek-r1:7b 2 部署docker2.1 官网下载amd版本安装2.2 配置wsl2.3 Docker配置&#xff1a;位置代理镜像源 3 部署RAGFlow更换ragfl…

嵌入式STM32学习——外部中断EXTI与NVIC的基础练习⭐

按键控制LED灯 按键控制LED的开发流程&#xff1a; 第一步&#xff1a;使能功能复用时钟 第二布&#xff0c;配置复用寄存器 第三步&#xff0c;配置中断屏蔽寄存器 固件库按键控制LED灯 外部中断EXTI结构体&#xff1a;typedef struct{uint32_t EXTI_Line; …

<前端小白> 前端网页知识点总结

HTML 标签 1. 标题标签 h1到h6 2. 段落标签 p 3. 换行 br 水平线 hr 4. 加粗 strong 倾斜 em 下划线 ins 删除 del 5. 图像标签 img src-图像的位置 alt- 图片加载失败显示的文字 替换文本 title--- 鼠标放到图片上显示的文字 提示…

历史数据分析——宁波海运

运输服务 运输服务板块简介: 运输服务板块主要是为货物与人员流动提供核心服务的企业的集合,涵盖铁路、公路、航空、海运、物流等细分领域。该板块具有强周期属性,与经济复苏、政策调控、供需关系密切关联,尤其是海运领域。有不少国内股市的铁路、公路等相关的上市公司同…

小结:jvm 类加载过程

类加载过程 是Java虚拟机&#xff08;JVM&#xff09;将字节码文件&#xff08;.class文件&#xff09;加载到内存中&#xff0c;并转换为运行时数据结构的过程。这个过程可以分为多个步骤&#xff0c;每个步骤都有其特定的任务和目的。根据你提供的信息&#xff0c;以下是类加…

OpenCv高阶(八)——摄像头调用、摄像头OCR

文章目录 前言一、摄像头调用通用方法1、导入必要的库2、创建摄像头接口 二、摄像头OCR1.引入库2、定义函数&#xff08;1&#xff09;定义显示opencv显示函数&#xff08;2&#xff09;保持宽高比的缩放函数&#xff08;3&#xff09;坐标点排序函数&#xff08;4&#xff09;…