您的位置:首页 > 其它

内存管理函数

2016-03-25 12:01 183 查看
内存管理函数

宗旨:技术的学习是有限的,分享的精神是无限的。


一、 动态申请内存

1、 malloc/free

——动态分配内存和释放内存

(1)函数原型

void *malloc(size_tsize);
void free(void *str);


(2)函数参数

         size:要分配的空间大小

(3)返回值

         返回一个指向分配的连续存储域首地址的指针。失败返回NULL。

注意:调用free()释放内存就,不能再去访问被释放的内存空间,这块内存已经不属于原来的应用程序,此时是悬挂指针,为了安全起见,一般会再次将此指针变量置NULL;不能两次释放相同的指针;malloc与free配套使用。

array = (int *)malloc(10 * sizeof(int));
free(array);
array = NULL;<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"> </span>


2、realloc

         ——更改已经配置的内存空间

(1) 函数原型

void *realloc(void *ptr, size_t size);


(2)函数参数

        ptr:试图更改大小的原堆空间位置;

        size:新的内存大小

(3)返回值

        如果内存减少,malloc仅改变索引信息。

        如果增加内存,如果当前内存段后面有足够的内存空间,则直接扩展内存空间,realloc将返回原指针;如果当前内存段后面的字节数不足,那么久使用堆中第一个能够满足这一要求的内存块,将目前的数据复制到新的位置并将原来的数据块释放掉,返回新的内存块地址;失败返回NULL,此时原来指针仍有效。

new_addr = (int*)realloc(old_addr, 100 * sizeof(int));

 

3、 calloc

——malloc的简单包装,把动态分配的内存初始化为0

void*calloc(size_t nmemb, size_t size)
{
void *p;
size_t total;
total = nmemb * size;
p = malloc(total);
if(p != NULL)
{
memset(p, '\0', total);
}
}
// ptr =(struct data *)calloc(count, sizeof(struct data));<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"> </span>


4、  alloca

void *alloca(size_t size)

——在栈中分配大小为size的内存,成功返回指针,失败返回NULL

 

二、内存数据管理函数

1、 memcpy【memcpy(p2, p1, 10);】

——内存拷贝

(1) 函数原型

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


(2)  函数参数

        dst:复制后数据存储的首地址

        src:数据源地址

        size:复制大小

(3)返回值

        执行成功返回目的地址。

memcpy()与strncpy():str参数是char *,memcpy参数是void *,memcpy更加强大,strncpy只能用于字符串操作,memcpy不止。void *——“空即是色”——强大。

bcopy()函数类似于memcpy()【bcopy多用于网络编程中】

void bcopy(const void *src, void *dest,size_t size);<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"> </span>


2、 memmove

——memcpy未考虑空间重叠,memmove考虑了。

(1)函数原型

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


(2)函数参数

        dst:复制后数据存储的首地址

        src:数据源地址

        size:复制大小

(3)返回值

        执行成功返回目的地址。

memmove函数在复制之前,首先检查源地址和目的地址是否重叠,有,则进行处理再拷贝,没有则直接拷贝。

 

3、 memset【memset(buffer, 0, sizeof(buffer));】

——初始化指定内存

(1)函数原型

void *memset(void *s, int c, size_t size);


(2)函数参数

        s:待初始化的内存首地址

        c:初始化的值,一般写0

        size:要初始化的内存大小

(3)返回值

        执行成功返回s的首地址

bzero与memset:bzero效率高一些。 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息