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]时,显示的结果如下:(更加证明是以字节方式赋值)
来源:CSDN
作者:cc0725
链接:https://blog.csdn.net/u011118276/article/details/46742341