C语言 内存函数

Posted 一朵花花

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言 内存函数相关的知识,希望对你有一定的参考价值。

上篇讲解了头文件<string.h>中的第一组以str开头的函数,此篇讲解以mem开头的第二组函数
mem开头的函数,是和内存相关的,与字符串没有关系

mem开头的函数,操作内存,是以字节为单位的

1.复制内存块 memcoy

函数原型:
void * memcpy ( void * destination, const void * source, size_t num )

将num个字节的值从source指向的位置拷贝到destination指向的内存块
把一块内存中的数据拷贝到另外一块内存空间中

memcpy注意事项:
1.只要是连续的内存空间,memcpy都可以进行拷贝
2.destination的空间要足够大,能够容下拷贝的内容
3.memcpy在遇到\\0的时,并不会停下来,直到拷贝够num个字节才会停下
4.memcpy本身是有bug的,没有解决覆盖问题,故可以选用memmove代替

代码实现

void* myMemcpy(void* dest, const void* source, size_t num) {
	//校验参数合法性
	assert(dest != NULL);
	assert(source != NULL);
	assert(num != 0);
	char* cdest = (char*)dest;
	const char* csrc = (const char*)source;
	//以字节为单位进行拷贝
	for (size_t i = 0; i < num; i++) {
		cdest[i] = csrc[i];
	}
	return dest;
}

2.移动内存块 memmove

函数原型:
void * memmove ( void * destination, const void * source, size_t num )

memmove注意事项:
1.当目标内存块与源内存块没有重叠时,则和memcpy函数功能相同
2.当目标内存块和源内存块有重叠时,memmove能够保证源内存块在被覆盖之前将重叠区域的字节拷贝到目标内存块中,但拷贝后的源内存块内容会改变

代码实现:

void* myMemmove(void* dest, const void* source, size_t num) {
	//校验参数合法性
	assert(dest != NULL);
	assert(source != NULL);
	assert(num != 0);
	char* cdest = (char*)dest;
	const char* csrc = (const char*)source;
	//重叠时,倒着拷贝
	if (csrc <= cdest && cdest <= csrc + num) {
		for (size_t i = num; i > 0; i--) {
			cdest[i - 1] = csrc[i - 1];
		}
		return dest;
	}
	//不重叠,顺着拷贝
	else {
		for (size_t i = 0; i < num; i++) {
			cdest[i] = csrc[i];
		}
		return dest;
	}
}

3. 比较内存块 memcmp

函数原型:
int memcmp ( const void * ptr1, const void * ptr2, size_t num )

比较两个内存中内容的"大小"关系,这样的比较没多大意义,比较规则类似于字符串的字典序
返回值和strcmp一样

代码实现:

int myMemcmp(const void* ptr1, const void* ptr2, size_t num) {
	//校验参数合法性
	assert(ptr1 != NULL);
	assert(ptr2 != NULL);
	assert(num != 0);
	const char* cptr1 = (const char*)ptr1;
	const char* cptr2 = (const char*)ptr2;
	for (size_t i = 0; i < num; i++) {
		if (cptr1[i] < cptr2[i]) {
			return -1;
		}
		else if (cptr1[i] > cptr2[i]) {
			return 1;
		}
		else {
			continue;
		}
	}
	return 0;
}

4. 填充内存块 memset

函数原型:
void * memset ( void * ptr, int value, size_t num )

memset注意事项:
1.在一段内存块中填充某个给定的值;
2.memset() 函数常用于内存空间初始化;
3.memset可以快速清空较大的结构体或者数组
4.memset最后一个参数是操作个数,一般建议使用 sizeof进行操作

代码实现:

void* myMemset(void* ptr, int value, size_t num) {
	//校验参数合法性
	assert(ptr != NULL);
	assert(num != 0);
	char* cptr = (char*)ptr;
	for (size_t i = 0; i < num; i++) {
		cptr[i] = (char)value;
	}
	return ptr;
}

以上是关于C语言 内存函数的主要内容,如果未能解决你的问题,请参考以下文章

C语言代码片段

用c语言如何获取内存地址?

在C语言中,如何给函数分配内存?

C语言中动态内存分配函数的用法及作用?(比如malloc,calloc,realloc等)

C 语言结构体 ( 结构体 数组 作为函数参数 | 数组 在 堆内存创建 )

浅谈C语言内存