前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >内存函数简介

内存函数简介

作者头像
用户11458826
发布2025-01-23 16:39:38
发布2025-01-23 16:39:38
6600
代码可运行
举报
文章被收录于专栏:杀马特杀马特
运行总次数:0
代码可运行

一.memcpy函数:

定义:在内存中用来copy一个数组内一定字节大小的数据到另一个数组内。

头文件:#include<string.h>

类型:

代码语言:javascript
代码运行次数:0
复制
void *memcpy(void*dest, const void *src, size_t n)
代码语言:javascript
代码运行次数:0
复制
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
//void* my_memcpy(void* s1, void* s2, size_t n) {
//	assert(s1 && s2);
//	char* start = (char*)s1;
//	while (n) {
//		*(char*)s1 =*(char*)s2;
//		((char*)s1)++;
//		((char*)s2)++;
//		n--;
//	}
//	return start;//这是我们模拟实现的memcpy;但是memcpy有个缺点不能copy重叠的内存区域
//
//
//}
//int main() {
//	char str1[9] = "abcdefg";
//	char str2[4] = "mnk";
//	/*memcpy(str1, str2, 2);*/
//	my_memcpy(str1, str2, 2);
//	printf("%s", str1);
//	return 0;
//}

 接下来会打印:

37b40649ef6d4201a8ba5269a6ddf377.png
37b40649ef6d4201a8ba5269a6ddf377.png

我们copy有重叠的就需要用memmove函数:

代码语言:javascript
代码运行次数:0
复制
void* my_memmove(void* s1, void* s2, size_t n) {
	assert(s1 && s2);
	char* ret = (char*)s1;
	if (s1 < s2) {
		while (n) {
			*(char*)s1 = *(char*)s2;
			((char*)s1)++;
			((char*)s2)++;
			n--;
		}
	}
	else while (n) {
		*((char*)s1 + n - 1) = (*(char*)s2 + n - 1);

		n--;
	}
	return ret;

}//以上也是我们模拟memmove函数;
int main() {
	char str1[9] = "abcdefg";
	my_memmove(str1,str1+2,4);
	printf("%s", str1);
	return 0;
}

打印有重叠的如下:

efcfc6c223e04b7091bc43961a167a5b.png
efcfc6c223e04b7091bc43961a167a5b.png
二.memset函数:
代码语言:javascript
代码运行次数:0
复制
int main() {
	char str1[20] = "xxxxxxxx";
	memset(str1 + 4, 'K', 2);
	printf("%s", str1);
	return 0;
}//如可以把从str1开始后的四个位置开始被k取代直到两个字节后

但是这个函数有个缺点无法将一个数组内所有的数据都更改,

代码语言:javascript
代码运行次数:0
复制
int arr[10] = { 1,2,3,4,5,6,7,8,9,10};
memset(arr, "5", 40);
for (int i = 0; i < 10; i++) {


	printf("%d", arr[i]);
}//这里将不会呈现满数组的5;
78c08208a79149b4b3fd2407e9f67901.png
78c08208a79149b4b3fd2407e9f67901.png
三.memcmp函数:

memcmp类似于字符串中strcmp函数;比较的是两个数组内的元素大小,输出数字跟strcmp一样

类型:

代码语言:javascript
代码运行次数:0
复制
int memcmp(const void *buf1, const void *buf2, unsigned int count);
代码语言:javascript
代码运行次数:0
复制
int main() {
	char str1[10] = "abd";
	char str2[5] = "af";
	int ret=memcmp(str1, str2, 2);
	printf("%d", ret);
}

输出结果: 

17bb2782b3a8477685b3eff8989a6581.png
17bb2782b3a8477685b3eff8989a6581.png

四.大小端问题以及有无符号字符型问题:

1·接下来我们用一个图来解释一下:

ca1eeee49d324fa1bae19034ca4b2006.png
ca1eeee49d324fa1bae19034ca4b2006.png

 我们来用一个代码判断机器是大小端:

代码语言:javascript
代码运行次数:0
复制
int main() {
	int n = 1;
	if (*(char*)&n == 1) {
		printf("小端");
	}
	else printf("大端");
	return 0;
91192ef4e8a24bb0b9ab745c9dc055c7.png
91192ef4e8a24bb0b9ab745c9dc055c7.png

2·对于有无符号字符:signed char范围为-128~127,而unsigned char 为0~255 ;

首先我们要明白我们存的是补码,再不同类型进行转化我们有时便需要整型提升以及截段啥的

807b5219d85c45f8945f67854f885148.png
807b5219d85c45f8945f67854f885148.png

因此我们还要掌握我们在有符号char类型加一从0开始到127然后再加一到-128,此后不断减小,直到-1,接着变为零这样循环。 

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-06-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一.memcpy函数:
    • 二.memset函数:
    • 三.memcmp函数:
  • 四.大小端问题以及有无符号字符型问题:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档