memcpy和strncpy有什么区别

2025-04-05 03:13:35
推荐回答(5个)
回答1:

c和c++使用的内存拷贝函数,memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中。
功能:从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中
1.source和destin所指的内存区域可能重叠,但是如果source和destin所指的内存区域重叠,那么这个函数并不能够确保source所在重叠区域在拷贝之前不被覆盖。而使用memmove可以用来处理重叠区域。函数返回指向destin的指针.
2.如果目标数组destin本身已有数据,执行memcpy()后,将覆盖原有数据(最多覆盖n)。如果要追加数据,则每次执行memcpy后,要将目标数组地址增加到你要追加数据的地址。

strncpy 是 C语言的库函数之一,来自 C语言标准库,定义于 string.h,char *strncpy(char *dest, char *src, int n),把src所指向的字符串中以src地址开始的前n个字节复制到dest所指的数组中,并返回dest。
功能:(c/c++)复制字符串src中的内容(字符,数字、汉字....)到字符串dest中,复制多少由size_tn的值决定。如果src的前n个字节不含NULL字符,则结果不会以NULL字符结束。如果src的长度小于n个字节,则以NULL填充dest直到复制完n个字节。src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符长度+'\0'。

回答2:

与strcpy相比,memcpy并不是遇到'\0'就结束,而是一定会拷贝完n个字节.

回答3:

strncpy(char
*s1,const
char
*s2,int
n);
看见了吧,参数必须是char*类型的。
void
*memcpy(void
*dest,
const
void
*src,
size_t
n);
参数可以是任意类型
还要注意,如果源数据串的中间有0的话,strncpy因为是字符串处理函数,会把0当成结束符,结束拷贝,导致数据只拷了一部分。memcpy不会发生这种情况。

回答4:

memcpy 是存储块 内容复制, 存储块大小 用 size_t 衡量。
void * memcpy ( void * destination, const void * source, size_t num );

strcpy 是字符内容 复制
char * strcpy ( char * destination, const char * source );

------------------------------
在 VC++ 编译器下
作为 C++ 程序是对的,作为 C 程序是错的。
#include
#include
#include
void main()
{
char *p = new char[3];
p = "3";
printf("%s\n",p);
strcpy(p,"44");
printf("%s\n",p);
}

打出:
3
44

回答5:

memcpy(dest,src,count) 是将dest所指开头的内存区域为count长度的内容复制至src, dest,src是void *型,返回值void *
strncpy(dest,src,count) 是将dest所指开头的内存区域为count长度的内容复制至src, 要求dest 是char *,src是const char*, 返回char *

char *p = new char[3];
p = "3";
strcpy(p,"44");

第一句语句中 p指针指向一段长度为3的内存区域
但是p="3"这句语句将p指针重新赋值,已经不再是指向上一语句指向的区域了,而是在系统的静态内存区申请了一段内存,内容为"3",p指针指向那块内存了,此时p所指的内存为只读,下面对p指向内存的内容所作的修改都是错误的