0
点赞
收藏
分享

微信扫一扫

软件测试--第六章、系统功能测试

日月同辉9908 2024-06-12 阅读 6

文章目录


1.memcpy使用和模拟实现

memcpy:内存拷贝

void * memcpy ( void * destination, const void * source, size_t num );
                    目标空间的地址          源空间的地址        被拷贝的字节个数
返回的是目标空间的起始地址
void*指针接收任意参数的地址
#include <stdio.h>
#include <assert.h>

void* my_memcpy(void* dest, const void* src, size_t num) {
	int i = 0;
	void* ret = dest;
	assert(src && dest);

	while (num--) {
		*(char*)dest = *(char*)src;
		dest = (char*)dest + 1;
		src = (char*)src + 1;
	}

	return ret;
}

int main() {
	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
	int arr2[20] = { 0 };
	//将arr1中的34567拷贝到arr2中
	my_memcpy(arr2, arr1 + 2, 20);

	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr2[i]);
	}
	return 0;
}

打印:

3 4 5 6 7 0 0 0 0 0

例如:

void* my_memcpy(void* dest, const void* src, size_t num) {
	int i = 0;
	void* ret = dest;
	assert(src && dest);

	while (num--) {
		*(char*)dest = *(char*)src;
		dest = (char*)dest + 1;
		src = (char*)src + 1;
	}

	return ret;
}

int main() {
	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
	//我们的想法是:将arr1中的12345拷贝到arr1中原来34567的地方,将原来的覆盖
	my_memcpy(arr1 + 2, arr1, 20);

	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr1[i]);
	}
	return 0;
}

打印:

1 2 1 2 1 2 1 8 9 10

memcpy函数不负责重叠内存的拷贝,只负责不重叠的内存,非要使用,结果就是未定义的。

不过说是这么说,有些时候memcpy也能实现重叠内存的拷贝。我们可以认为memcpy实现的拷贝不一定都对。所以重叠就用memmove函数。

memmove函数来处理重叠内存的拷贝。


2.memmove使用和模拟实现

memmove:内存移动

void * memmove ( void * destination, const void * source, size_t num );
#include <string.h>

int main() {
	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
	//将arr1中的12345拷贝到arr1中原来34567的地方,将原来的覆盖
	memmove(arr1 + 2, arr1, 20);

	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr1[i]);
	}
	return 0;
}

打印:

1 2 1 2 3 4 5 8 9 10

在这里插入图片描述

在这里插入图片描述

模拟实现:

void* my_memmove(void* dest, const void* src, size_t num) {
	void* ret = dest;
	assert(src && dest);
	if (dest < src) {
		while (num--) {
			*(char*)dest = *(char*)src;
			dest = (char*)dest + 1;
			src = (char*)src + 1;
		}
	}
	else {
		while (num--) {
			*((char*)dest + num) = *((char*)src + num);

		}
	}
	
	return ret;
}

int main() {
	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
	//将arr1中的12345拷贝到arr1中原来34567的地方,将原来的覆盖
	my_memmove(arr1 + 2, arr1, 20);

	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr1[i]);
	}
	return 0;
}

打印:

1 2 1 2 3 4 5 8 9 10

3.memset函数的使用

memset:内存设置

void * memset ( void * ptr, int value, size_t num );

memset是用来设置内存的,将内存中的值以字节为单位设置成想要的内容。

#include <stdio.h>
#include <string.h>
int main ()
{
    char str[] = "hello world";
    memset (str,'x',6);
    printf(str);
    return 0;
}

打印:

xxxxxxworld

4.memcmp函数的使用

memcmp:内存比较

int memcmp ( const void * ptr1, const void * ptr2, size_t num );

返回值如下:

在这里插入图片描述


#include <stdio.h>
#include <string.h>
int main()
{
    int arr1[] = { 1,2,3,4,5 };
    //01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 05 00 00 00
    int arr2[] = { 1,2,3,6,5 };
    //01 00 00 00 02 00 00 00 03 00 00 00 06 00 00 00 05 00 00 00
    int ret = memcmp(arr1, arr2, 12);
    printf("%d\n", ret);
    return 0;
}

打印:

0

因为前12个字节一样


#include <stdio.h>
#include <string.h>
int main()
{
    int arr1[] = { 1,2,3,4,5 };
    //01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 05 00 00 00
    int arr2[] = { 1,2,3,6,5 };
    //01 00 00 00 02 00 00 00 03 00 00 00 06 00 00 00 05 00 00 00
    int ret = memcmp(arr1, arr2, 13);
    printf("%d\n", ret);
    return 0;
}

打印:

-1

因为第13个字节不一样

举报

相关推荐

0 条评论