【C语言】明析部分C语言内存函数

2024-06-04 8007阅读

目录

1.memcpy

2.memmove

3.memset

4.memcmp


【C语言】明析部分C语言内存函数 第1张

【C语言】明析部分C语言内存函数 第2张

以下都是内存函数,作用单位均是字节

1.memcpy

memcpy是C/C++语言中的一个内存拷贝函数,其原型为:

void* memcpy(void* dest, const void* src, size_t n);
            目标空间(字节)  源空间(字节)  拷贝个数

该函数的功能是将源地址src开始的n个字节内容复制到目标地址dest开始的内存空间。 

使用memcpy函数需要注意以下几点:

  • 要确保目标地址dest有足够的空间来存放从源地址src复制过来的数据,否则可能会发生内存溢出。
  • 要确保源地址src和目标地址dest指向的内存内容是可读写的。
  • 在使用该函数时需要注意边界情况,即源地址src和目标地址dest的有效数据范围。

    接下来,我们观察memcpy函数:

    #include 
    #include 
    int main() {
        const char* src = "Hello, memcpy!";
        char dest[20];
        // 复制字符串到dest中
        memcpy(dest, src, strlen(src) + 1);
        // 输出复制后的字符串
        printf("Copied string: %s\n", dest);
        return 0;
    }

    程序运行结果:

    Copied string: Hello, memcpy!

    很显然,源字符串“Hello, memcpy!”已成功被复制到了目标字符数组dest中。

    现在,我们来观察memcpy函数的实现方式:

    //Memcpy
    #include
    #include
    void* Memcpy(void* dest, const void* src, size_t byte_num) {
    	assert(dest && src);
    	char* ptr_1 = (char*)dest;
    	const char* ptr_2 = (const char*)src;
    	while (byte_num) {
    		*ptr_1 = *ptr_2;
    		ptr_1++;
    		ptr_2++;
    		byte_num--;
    	}
    	return dest;//返回指向目标内存块的指针。
    }
    int main() {
    	int arr[] = { 1,2,3,4,5,6,7,8,9,0 };
    	int src[] = { 8,8,8,8,8,8,8,8,8,8 };
    	Memcpy(arr, src, 15);
    	for (int i = 0; i  
     
    

    2.memmove

    memmove函数与memcpy函数功能相似,但是memmove函数会考虑源地址和目标地址重叠的情况,它会根据具体情况采取不同的拷贝方式,避免数据错误或内存访问冲突。

     接下来,我们观察memmove函数:

    #include 
    #include 
    int main() {
        char str[50] = "Hello, memmove!";
        char buffer[20];
        
        // 复制数据到buffer,源和目标地址重叠
        memmove(str + 7, str, strlen(str) + 1); 
        // 输出复制后的字符串
        printf("Copied string: %s\n", str);
        return 0;
    }

     很容易发现,memmove函数可以作用于同一个函数

     我们再看看该函数的模拟实现:

    void* my_memmove(void* dest, const void* src, size_t n) {
        char* d = (char*)dest;
        const char* s = (const char*)src;
        
        // 判断源地址和目标地址是否有重叠
        if (d  s) {
            for (size_t i = n; i > 0; i--) {
                d[i - 1] = s[i - 1];
            }
        }
        
        return dest;
    }

    my_memmove函数和标准的memmove函数功能类似,可以处理源地址和目标地址重叠的情况。如果源地址在目标地址之前,就从源地址前往后复制数据;如果源地址在目标地址之后,就从源地址后往前复制数据。

    3.memset

     memset函数是C标准库中的一个函数,用于将一块内存空间的内容全部设置为指定的值。

    接下来,我们观察memset函数: 

    #include 
    #include 
    int main() {
        char str[50];
        
        // 初始化str数组为0
        memset(str, 0, sizeof(str));
        // 打印初始化后的字符串
        printf("Initialized string: %s\n", str);
        return 0;
    }
    Initialized string:

     在这个例子中,我们先定义了一个字符数组str,然后使用memset函数将str数组内的内存空间全部设置为0。最后打印出初始化后的字符串内容,因为全部设置为0,所以输出结果为"Initialized string: "。

       memset函数通常用于在初始化数据结构或清空内存块时设置初始值,例如清空一个数组、结构体或其他内存区域的内容。

    我们再看看该函数的模拟实现:

    void* my_memset(void* ptr, int value, size_t num) {
        unsigned char* p = (unsigned char*)ptr;
        for (size_t i = 0; i  
     
     

     这个模拟实现的my_memset函数功能类似于标准的memset函数,通过将内存空间中的每个字节设置为指定的值来实现初始化。传入的参数包括要初始化的内存位置的指针 ptr,要设置的值 value,以及要初始化的字节数 num。循环遍历内存空间,将每个字节设置为指定的值。最后返回指向初始化后的内存空间的指针。

    4.memcmp

    memcmp是C标准库中的一个函数,用于比较两块内存区域的内容。

    接下来,我们观察memset函数: 

    #include 
    #include 
    int main() {
        char str1[] = "Hello";
        char str2[] = "World";
        int result = memcmp(str1, str2, 5);
        if (result == 0) {
            printf("str1 and str2 are equal.\n");
        } else if (result  
    
    str1 is less than str2.

    这是因为在ASCII编码中,字符'H'的ASCII码小于字符'W'的ASCII码。因此,str1在内存中的前5个字符的比较结果是str1小于str2。 

    Over……希望对你有帮助,fight together!【C语言】明析部分C语言内存函数 第3张


    免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

    目录[+]