memcpy/memset函数的c语言实现

核能气质少年 提交于 2019-12-08 17:24:44

1、memcpy

头文件:#include <string.h>

函数原型:void *memcpy(void *dest, const void *src, size_t n)

功能:将指针src指向的内存空间的n个字节复制到dest指针指向的内存空间

参数:src 为原内容内存的起始地址,dest为复制到目标地址的起始地址

返回值:目标dest内存的起始地址

注意:1、内存空间不能够有重叠;

   2、memcpy对于需要复制的内容没有限制,因此用途更广;

      3、很明确的是memcpy是将 n个字节,  虽然memcpy对复制的内容完全没有任何的限制,比如数组,结构体等特殊的结构,如果你想将整个结构体变量的内容复制到dest内存区,最好使用sizeof将要复制的内容的完整大小求出来赋值给n,以保持复制的完整性;

c代码:

void *memCpy(void *dest, const void *src, size_t n)
{
	if (NULL == dest || NULL == src || n < 0)
		return NULL;
	char *tempDest = (char *)dest;
	char *tempSrc = (char *)src;

	while (n-- > 0)
		*tempDest++ = *tempSrc++;
	return dest;	
}

2、memset

头文件:#include <string.h>

函数原型:void *memset(void *s, int c, size_t n)

功能:以s为起始位置的n个字节的内存区域用整数c进行填充

参数:s为内存区域的起始位置,c为要填充的字符,n为要填充多少个字节

返回值:目标s内存的起始地址

注意:1、n表示的是字节数,函数是以字节的形式每次赋值给目标地址;

      2、memset函数也是以字节为单位进行赋值的,所以要想在整形数组中给每一位赋确定的非0值,一般来讲是不可行的;(下方将有对此说明测试的程序)

c代码:

void *memSet(void *s, int c, size_t n)
{
	if (NULL == s || n < 0)
		return NULL;
	char * tmpS = (char *)s;
	while(n-- > 0)
		*tmpS++ = c;
		return s; 
}

下面是针对注意事项的测试程序:

#include <stdio.h>
#include <string.h>
void *memSet(void *s, int c, size_t n)
{
	if (NULL == s || n < 0)
		return NULL;
	char * tmpS = (char *)s;
	while(n-- > 0)
		*tmpS++ = c;
	return s; 
}
int main()
{
	int buf[10];
	int i;
	printf("%d\n", sizeof buf);
	for (i = 0; i < 10; i++)
		printf("buf[%d] = %d\n", i, buf[i]);
	printf("------------------------------------\n");
	memSet(buf, 1, sizeof(buf));
	for (i = 0; i < 10; i++)
		printf("buf[%d] = %d\n", i, buf[i]);
	return 0;
}

结果:


结果分析:可以看出得出的结果并没有得到想要的1,而得出不知道是什么的东西;

1的二进制表示是:0000 0000 0000 0000 0000 0000 0000 0001

memset函数也是以字节为单位进行赋值的,指针每次只会向后移动一个字节,依此将值赋给每次的地址中,直到n = 0;

最后在四个字节中赋值的结果为:0000 0001 0000 0001 0000 0001 0000 0001 

十进制显示就为:16843009

当把数组改成char buf[10]时,显示的结果如下:(更加证明是以字节方式赋值)





易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!