首页 > 系统相关 >内存的操作

内存的操作

时间:2024-08-22 10:51:20浏览次数:8  
标签:int void dest 内存 操作 include size

我们对于内存的操作借助于 string.h 这个库提供的内存操作函数。
内存填充
头文件: #include <string.h>
函数原型: void *memset(void *s,int c,size_t n);
函数功能:填充s开始的堆内存空间前n个字节,使得每个字节值为c。
函数参数:
void *s:待操作内存首地址。
int c:填充的字节数据。
size_t n:填充的字节数。
返回值:返回s
注意:c常常设置为0,用于动态内存初始化
案例:

/**
* 内存操作函数-memset
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void test1()
{
// 在堆内存申请了一块存储空间
int *p = (int*)malloc(4 * sizeof(int));
if(!p)
{
puts("内存分配失败!");
return;// 后续代码不需要执行
}
// 给这块内存进行初始化操作(填充)
memset(p,0, 4 * sizeof(int));
printf("%d\n",*(p+1));
// 内存使用完毕,进行回收
free(p);
p = NULL;
}
int main()
{
test1();
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对应的内存中。
函数参数:
void *dest:目标内存首地址。
void *src:源内存首地址。

size_t n:拷贝的字节数。
返回值:返回dest
注意:内存申请了几个内存空间,就访问几个内存空间,否则数据不安全
注意:memcpy与memmove一般情况下是一样的,更建议使用memmove进行内存拷贝;
因为memmove函数是从自适应(从后往前或者从前往后)拷贝,当被拷贝的内存和目的地的内存
有重叠时,数据不会出现拷贝错误。而memcpy函数是从前往后拷贝,当被拷贝的内存和目的地内
存有重叠时,数据会出现拷贝错误。
案例:

内存比较
头文件: #include <string.h>
函数原型: int memcmp(void *dest,const void *src,size_t n)
函数功能:比较src和dest所代表的内存前n个字节的数据;
函数参数:
void *dest:目标内存首地址
const void* src:源内存首地址
size_t n:比较的字节数
返回值:

0 :数据相同
>0 :dest中的数据大于src
<0 :dest中的数据小于src
注意:n一般和src,dest的总容量一样;如果不一样,内促比较的结果就不确定了。
案例:

/**
* 内存操作-memcmp
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void test1()
{
// 申请内存
int *p1 = (int*)malloc(3*sizeof(int));
int *p2 = (int*)malloc(4*sizeof(int));
// int p1[4] = {1,0,3,6};
// int p2[4] = {1,2,3,4};
// int result = memcmp(p1,p2,4*sizeof(int));
*p1 = 65;
*p2 = 70;
char *a = (char*)p1;// 类型转换
char *b = (char*)p2;
printf("%c,%c\n",*a,*b);
int result = memcmp(a+1,b+1,1*sizeof(char));
printf("%d\n",result);
}
int main()
{
test1();
}

内存查找
头文件: #include <string.h>
函数原型: int *memchr|*memrchr(const void *s,int c,size_t n)
函数功能:在s开始的堆内存空间前n个字节中查找字节数据c
函数参数:
const void *s:待操作内存首地址;
int c:待查找的字节数据
size_t n:查找的字节数
返回值:返回查找到的字节数据地址
注意:如果内存中没有重复数据,memchr和memrchr结果是一样的;如果内存中有重复数据,
memchr和memrchr结果就不一样;
举例:

            void *memrchr(..);// 在使用时编译会报错,需要使用外部声明
        // 外部申请
        extern void *memrchr(..);

案例:

/**
* 内存操作-memchr | memrchr
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 声明外部函数
extern void *memrchr(const void *s,int c,size_t n);
void test1()
{
// 申请内存
int *p = (int*)malloc(4*sizeof(int));
if(!p)
{
puts("内存分配失败!");
return;
}
// 给变量赋值
for(int i = 0; i < 4; i++)
{
p[i] = i * 2;
}
p[3] = 4;
// 输出
for(int i = 0; i < 4; i++)
{
printf("%d,",p[i]);
}
printf("\n");
// 内存查找 memchr
int *x = (int*)memchr(p,4,4*sizeof(int));
printf("%p--%p--%d\n",x,p,*x);
// 内存查找 memrchr
int *y = (int*)memrchr(p,4,4*sizeof(int));
printf("%p--%p--%d\n",y,p,*y);
// 回收内存
free(p);
p = NULL;
}
int main()
{
test1();
}

标签:int,void,dest,内存,操作,include,size
From: https://blog.csdn.net/m0_74834289/article/details/141366186

相关文章

  • 操作系统之面试常考
    【转载】:https://www.cnblogs.com/zyf-zhaoyafei/p/4714598.html最近这段时间正在积极准备面试,复习到操作系统部分,本篇文章就介绍操作系统基础内容,参考第四版《计算机操作系统》这本文章总结了面试中常考、常用到的基本知识点,希望对准备面试的同学和想回顾操作系统知识点的程序......
  • python configparser操作配置文件
    一、configparser概述configparser是Pyhton标准库中用来解析配置文件的模块;Python2.x中名为ConfigParser,3.x已改名为configParser二、配置文件的格式常见的配置文件后缀:.ini,.conf等,主要结构为包括以下的文本信息:sections(段)keys(properties\键)values(值)格式如下......
  • df['料品分类'].apply(format_value) 是一个 Pandas 操作,用于对 DataFrame 中的 '料品
    df['料品分类'].apply(format_value)是一个Pandas操作,用于对DataFrame中的'料品分类'列的每个值应用一个名为format_value的函数,并将处理后的结果返回给这一列。分解解释df['料品分类']:这部分代码选择DataFramedf中名为'料品分类'的列。df是一个PandasDat......
  • 矢量化操作是 Pandas 的一个强大特性
    矢量化操作是Pandas的一个强大特性,它允许你对整个DataFrame或Series进行操作,而不需要显式地写出循环。矢量化操作利用底层的C语言实现和优化,使得它在处理大数据集时比循环效率更高。使用矢量化操作替代iterrows()的示例假设你有以下DataFramedf,并且你想要在每一行上......
  • SAP Parallel Accounting(平行分类账业务)配置及操作手册【适用于多国家会计准则】
    1.配置准备1.1理解平行账概念平行账,也称为多分类账,是SAP系统中的一项功能,它允许企业按照不同的会计准则来维护各自的财务数据。这种设置特别适用于那些需要符合多种会计准则的跨国公司。通过平行账,企业可以在不同的分类账中记录相同的交易,但按照各自的会计政策进行处理。......
  • 【读书笔记-《30天自制操作系统》-6】Day7
    本篇向着移动鼠标的目标继续前进。先对中断处理进行一些补充说明,然后建立完善缓冲区来实现键盘数据接收。最后是在此基础上的初始化鼠标控制电路与鼠标的数据接收。1.中断处理程序补充说明前面的处理中,接收到键盘中断后只是显示一行信息,现在把按键的信息也一并显示出来......
  • 计算机四个方面:计算、存储、通信与程序;操作系统
    一、计算、存储、通信与程序计算机系统的四个基本方面是计算、存储、通信与程序。下面我将详细介绍这四个方面的特点、区别,以及在Linux系统中与之对应的自带命令。1.计算特点:计算是计算机最基本的功能,涉及数据的处理、运算和逻辑判断。计算能力决定了计算机解决问题的......
  • 引发C++程序内存泄漏的常见原因分析与排查方法总结
    目录1、概述2、内存泄漏与程序的位数3、调用哪些接口去动态申请内存?4、引发内存泄漏的常见原因总结4.1、通过malloc/new等动态申请的内存,在使用完后,没有调用free/delete去释放(也可能是调用了上面讲到的HeapAlloc或VirtualAlloc等API接口)4.2、函数调用者调用内部申请内存......
  • IPC对象通信方式---共享内存 | 网络通信 -编程
    共享内存共享内存机制其允许两个或多个进程共享一个给定的存储区,这一段存储区可以被两个或两个以上的进程映射至自身的地址空间中,一个进程写入共享内存的信息,可以被其他使用这个共享内存的进程,通过一个简单的内存读取错做读出,从而实现了进程间的通信。是内核预留的内存空间,最......
  • 操作系统线程介绍
    线程介绍什么是线程:线程是操作系统能内够进行运算、执行的最小单位,它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。总结:线程是进程的一部分,是进程内负责执行的单位,进程是由资......