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;
}

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