首页 > 系统相关 >【C语言】内存函数

【C语言】内存函数

时间:2024-08-18 12:52:11浏览次数:13  
标签:src 函数 int void C语言 char 内存 include dst

memcpy使用和模拟实现

 void * memcpy ( void * destination, const void * source, size_t num );

介绍:
• 函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置。
• 这个函数在遇到 ‘\0’ 的时候并不会停下来。
• 如果source和destination有任何的重叠,复制的结果都是未定义的。

官方文档介绍截图:
在这里插入图片描述
使用示例:

#include <stdio.h>
#include <string.h>
int main()
{
	 int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
	 int arr2[10] = { 0 };
	 memcpy(arr2, arr1, 20);
	 int i = 0;
	 for (i = 0; i < 10; i++)
	 {
		 printf("%d ", arr2[i]);
	 }
	 return 0;
}

对于重叠的内存,交给memmove来处理

模拟实现:

void * memcpy ( void * dst, const void * src, size_t count)
{
	 void * ret = dst;
	 assert(dst);
	 assert(src);
	 /*
	 * copy from lower addresses to higher addresses
	 */
	 while (count--) 
	 {
		 *(char *)dst = *(char *)src;
		 dst = (char *)dst + 1;
		 src = (char *)src + 1;
	 }
	 return(ret);
}

memmove 使用和模拟实现

void * memmove ( void * destination, const void * source, size_t num )

介绍:
• 和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。
• 如果源空间和目标空间出现重叠,就得使用memmove函数处理。

官方文档介绍截图:
在这里插入图片描述
使用示例:

#include <stdio.h>
#include <string.h>
int main()
{
	 int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
	 memmove(arr1+2, arr1, 20);
	 int i = 0;
	 for (i = 0; i < 10; i++)
	 {
	 	printf("%d ", arr2[i]);
	 }
	 return 0;
}

运行结果:
1 2 1 2 3 4 5 8 9 10

模拟实现

void * memmove ( void * dst, const void * src, size_t count)
{
	 void * ret = dst;
	 if (dst <= src || (char *)dst >= ((char *)src + count)) {
	 /*
	 * Non-Overlapping Buffers
	 * copy from lower addresses to higher addresses
	 */
		 while (count--) 
		 {
			 *(char *)dst = *(char *)src;
			 dst = (char *)dst + 1;
			 src = (char *)src + 1;
		 }
	 }
	 else 
	 {
	 /*
	 * Overlapping Buffers
	 * copy from higher addresses to lower addresses
	 */
		 dst = (char *)dst + count - 1;
		 src = (char *)src + count - 1;
		 while (count--) 
		 {
			 *(char *)dst = *(char *)src;
			 dst = (char *)dst - 1;
			 src = (char *)src - 1;
		 }
	 }
 	 return(ret);
}

memset 函数的使用

void * memset ( void * ptr, int value, size_t num );

介绍:
memset是用来设置内存的,将内存中的值以字节为单位设置成想要的内容。

官方文档介绍截图:
在这里插入图片描述
使用示例:

#include <stdio.h>
#include <string.h>
int main ()
{
 char str[] = "hello world";
 memset (str,'x',6);
 printf(str);
 return 0;
}

运行结果:
xxxxxxworld

memcmp 函数的使用

int memcmp ( const void * ptr1, const void * ptr2, size_t num )

介绍:
• 比较从ptr1和ptr2指针指向的位置开始,向后的num个字节
• 返回值如下:
在这里插入图片描述
使用示例:

#include <stdio.h>
#include <string.h>
int main()
{
 char buffer1[] = "DWgaOtP12df0";
 char buffer2[] = "DWGAOTP12DF0";
 int n;
 n = memcmp(buffer1, buffer2, sizeof(buffer1));
 if (n > 0) 
 	printf("'%s' is greater than '%s'.\n", buffer1, buffer2);
 else if (n < 0) 
 	printf("'%s' is less than '%s'.\n", buffer1, buffer2);
 else
 	printf("'%s' is the same as '%s'.\n", buffer1, buffer2);
 return 0;
}

标签:src,函数,int,void,C语言,char,内存,include,dst
From: https://blog.csdn.net/Sakura_ding/article/details/141274743

相关文章

  • C语言学习————常量和宏、初识指针
    #define定义常量和宏define是一个预处理指令用途:1.define定义符号#defineMAX1000intmain(){ printf("%d\n",MAX); return0;}2.define定义宏#defineADD(X,Y)((X)+(Y))intmain(){ printf("%d\n",ADD(2,3)); return0;}指针内存内存是计算机上特......
  • 1-1 函数四大性质
    1-1函数四大性质3.单调性......
  • Excel vba自定义函数公式智能提示
    效果如下第一步下载,智能提示显示xll文件Releases·Excel-DNA/IntelliSense(github.com)xll文件报病毒解决办法默认情况下,Excel正在阻止不受信任的XLL加载项-Microsoft支持 第二步,加载xll文件,xll文件放在excel插件目录:%appdata%\Microsoft\AddIns 第三步编写e......
  • Python-程序语法 - Python注释&基本函数
    Python注释以#为行开头为注释相关函数str()---传入一个整型值,并求值为它的字符串形式Python2.7.17(default,Mar82023,18:40:28)[GCC7.5.0]onlinux2Type"help","copyright","credits"or"license"formoreinformation.>>>str......
  • C语言 错误 C4716 “printstar”: 必须返回一个值
    错误:解决办法: 此类代码显然不需要返回值1.点击“项目”——“属性”2.点击“C/C++”中的“高级”——“禁用特定警告”中输入“4716”——点击“确定” 3.重新运行即可成功 ......
  • 操作系统-内存、文件管理
    一、内存管理的层次关系用户层STL自动分配、自动释放调用C++C++new/delete、构造/析构调用CCmalloc\calloc\realloc\free调用POSIX\LinuxPOSIXsbrk\brk调用KernalLinuxmmap\munmap调用Kernal系统层Kernalkmalloc\vmalloc调用驱......
  • 内存表(FDMEMTABLE)
    内存表的优点是快,非常快,号称比BDE的clientdataset快很多。内存表不但快,还可以另存为XML、BIN、CSV等数据。也可直接作为stream传送。所以,追求速度的时候,获得数据后即解除锁定的时候,都可能需要用到内存表。内存表也可用于把来自其他数据库管理系统的数据表存储为FIREDAC的数据表。......
  • c语言(8.18)
    补一下前几天练习的代码#include<stdio.h>intmain(){ intn=0; //scanf("%d",&n); intsum=0; for(intj=1;j<=10;j++) { intmul=1;//mul应该放在里面才行,每一次新的阶乘mul都是1 for(inti=1;i<=j;i++) { mul=mul*i; }......
  • 【时时三省】(C语言基础)调试技巧2
    山不在高,有仙则名。水不在深,有龙则灵。             ----CSDN时时三省多多动手,尝试调试,才能有进步。•一定要熟练掌握调试技巧。•初学者可能80%的时间在写代码,20%的时间在调试。但是一个程序员可能20%的时间在写程序,但是80%的时间在调试。•我......