c语言strcpy、strncpy、memcpy内存拷贝比较

c语言strcpy、strncpy、memcpy内存拷贝比较

/*********************************************************
参考:
https://blog.csdn.net/zhanghuan_wangkai/article/details/51674935

*  *******************************************************/
#include <stdio.h>
#include<string.h>
#include <assert.h>

void *my_memcpy(void *memTo, const void *memFrom, int size)
{
	//入口参数检查
	assert((memTo != NULL) && (memFrom != NULL));
	char *tempFrom = (char *)memFrom;
	char *tempto = (char *)memTo;

	//循环size次,复制memFrom的值到memTo中
	while (size-- > 0)
	{
		*tempto++ = *tempFrom++;
	}
	return memTo;
}


int main()
{
	char *strSrc = "hello wrold";
	char strDest[7] = {0};
	

	//strpcy-------------------------
	strcpy(strDest, strSrc);
	printf("strDest:%s\n", strDest);//会拷贝strSrc的末尾\0,当strlen(strSrc)>sizeof(strDest),strDest越界

	char s1[] = "123";
	char s2[] = "456";


	//栈内存是一个自顶向下分布的数据结构,那么越先定义的变量地址就越高,越后定义的地址就越低。 \
	s比d定义在前, 那么s得到了高地址, 而d得到了相对低的地址
	char s[] = "abcdefghi";
	char d[] = "abc";//末尾\0
	strcpy(d, s);
	printf("d=%s,\ns=%s", d, s);//s中内存:efghi0ghi0,输出efghi
	/*
	低------->高地址,低地址先存储d数组,共4个字符,包括\0,
	abc0abcdefghi0
	strcpy拷贝后,d数组越界,破坏了s数组里的数据
	abcdefghi0ghi0
	*/


	//strnpcy------------------------------
	//如果strlen(src)的值小于len,dst数组就用\
	额外的NUL字节填充到len长度,如果strlen(src)的值大于或等于len,那么只有len个字符被复制到dst中。

	char message[] = "abcd";
	strncpy(message, "abcde", 5);
	printf("message:%s\n", message);//abcde??乱码

	char message1[] = "abcdefghik";
	strncpy(message1, "abe", 5);
	printf("message1:%s\n", message1);//message1内存值,abe后自动填充2个0,凑成5个字符:abe00fghik0----strlen(src)的值小于len

	char message3[] = "abcdefghik";
	strncpy(message3, "abe", 4);
	printf("message3:%s\n", message3);//message3内存值,abe后自动填充1个0,凑成4个字符:abe0efghik0----strlen(src)的值小于len

	char message2[] = "abcdefghik";
	strncpy(message2, "abe", 3);
	printf("message2:%s\n", message2);//message2内存值,刚好拷贝abe3个字符:abedefghik0----strlen(src)的值等于len

	char message4[] = "abcdefghik";
	strncpy(message4, "mnq", 2);
	printf("message4:%s\n", message4);//message4内存值,只拷贝前2个字符:mncdefghik0----strlen(src)的值大于len


	//strnpcy有地址重叠,覆盖----------------
	char message5[] = "abcdefghik";
	strncpy(message5+2, message5, 3);
	printf("message5:%s\n", message5);


	//memcpy,src和dest所指内存区域不能重叠--------
	char message6[] = "abcdefghik";
	memcpy(message6, "mnq", 2);
	printf("message6:%s\n", message6);//message6内存值,只拷贝前2个字符:mncdefghik0----strlen(src)的值大于len

	char message8[] = "abcdefghik";
	memcpy(message8, "mn", 2);
	printf("message8:%s\n", message8);//message8内存值,只拷贝前2个字符:mncdefghik0----strlen(src)的值等于len

	char message7[] = "abcdefghik";
	memcpy(message7, "abe", 5);
	printf("message7:%s\n", message7);//message7内存值,只拷贝sizeof("abe")共4个字符:abe0defghik0-----strlen(src)的值小于len

	return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章