常用的内存操作函数

接下来我们进行详细剖析一些内存操作的函数:


1.malloc()函数,calloc()函数和free()函数

  • malloc()函数和free()函数

malloc()函数原型:

void *malloc(size_t size);

malloc()函数用来内存分配,如果分配成功则返回指向被分配内存的指针(此存储区中的初始值不确定),否则返回空指针NULL。当然,对于malloc()函数所对应的就是free()函数,你所开辟的内存,后来当然需要释放。注意malloc()函数是在堆上进行操作的。

free()函数原型:

void free(void *pointer);

free()函数 是用来把在前面分配出去的内存进行回收,以备后备之需。

  • calloc()函数和realloc()函数

calloc()函数原型:

void *calloc(size_t num_elements,size_t element_size);

calloc()函数也用于分配内存,它主要是要把分配的内存会初始化为0。

realloc()函数原型:

void realloc(void *ptr,size_t new_size);

realloc()函数用于修改一个原先已经分配好的内存块的大小。使用这个函数,可以进行内存的扩大和缩小。

这几个函数我在前期的一篇博客中已经详细的叙述过了,在此就不再太多声明了。
C语言之动态分配内存

2.memcpy()函数,memmove()函数和memset()函数

  • memcpy()函数

memcpy()函数原型:

void *memcpy(void *dst, void const *src, size_t length);

memcpy()函数实现:

//memcpy( )函数的实现
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
void *my_memcpy(void *dest, const void* src, size_t length)
{
    assert(src);
    char *pdest = (char *)dest;
    const char *psrc = (const char *)src;
    while (length--)
    {
        *pdest = *psrc;
        pdest++;
        psrc++;
    }
    return dest;
}
int main()
{
    char arr1[20] = "abcd";
    char *arr2 = "efgk";
    my_memcpy(arr1, arr2, 2);
    printf("%s\n", arr1);
    system("pause");
    return 0;
}

memcpy()函数从src的起始位置复制length个字节到dest的内存起始位,memcpy( )函数 并不关心被复制的数据类型,只是逐字节地进行复制,这给函数的使用带来了很大的灵活性,可以面向任何数据类型进行复制。
注意:
dest 指针要分配足够的空间,也即大于等于 num 字节的空间。如果没有分配空间,会出现断错误。
dest 和 src 所指的内存空间不能重叠。
在这里面的重叠问题,就是以下这种情况:
这里写图片描述

为了解决这一种重叠的问题,在此我们引入了另一个内存操作函数:memmove()函数。

  • memmove()函数

memmove()函数原型:

void *memmove(void *dst, void const *src,size_t length);

memmove()函数函数和memcpy()函数所进行的操作差不多,不过会考虑重叠的问题,所以,对于源和目标参数可能存在重叠问题,那么就可以使用memmove(),当src 和 dest 所指的内存区域重叠时,memmove() 仍然可以正确的处理,不过执行效率上会比使用 memcpy() 略慢些。

memmove()函数实现:

//memmove()函数的实现
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
void *my_memmove(void *dst, void * src, size_t length)
{
    assert(dst);
    assert(src);
    char *pdest = (char *)dst;
    const char *psrc = (const char *)src;
    if ((pdest > psrc) && (pdest<psrc + length))
            {//从后向前拷贝
                while(length--)
                {
                    *(pdest+length) = *(psrc+length);
                }
            }
            else
            {//从前向后拷贝
                while(length--)
                {
                    *pdest++ = *psrc++;
                }
            }   
            return dst;
}

int main()
{
    int i = 0;

    int arr1 []= { 1,2,3,5,4,6,8 };
    int sz = sizeof(arr1) / sizeof(arr1[0]);
    my_memmove(arr1 + 2, arr1, 16);
    for (i = 0; i<sz; i++)      
    {
        printf("%x ",arr1[i]);
    }
    system("pause");
    return 0;
}
  • memset函数
    memset函数原型:
void *memset(void *a, int ch, size_t length);

memset()函数是把从a开始的length个字节都设置成为字符值ch,然后返回指向 ptr 的指针。
memset( ) 可以将一段内存空间全部设置为特定的值,所以经常用来初始化字符数组。

memset函数实现:

//memset()函数实现

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
void *my_memset(void *dest, int n, size_t length)
{
    void *ret = dest;
    assert(dest);
    while(length--)
    {
        *(char *)dest = n;
        dest = (char*)dest+1;
    }
    return ret;
}
int main()
{
    int arr1[10];
    int i = 0;
    int sz = sizeof(arr1) / sizeof(arr1[0]);
    my_memset(arr1, 0, sz*sizeof(int));
    for ( i = 0; i<sz; i++)
    {
        printf("%d ",arr1[i]);
    }
    system("pause");
    return 0;
}
  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值