iOS学习总结iOS 易混淆的点iOS Developer

iOS零碎知识--C语言内存分配函数区别

2016-05-17  本文已影响407人  云之君兮鹏
无奈朝来寒雨,晚来风

1. malloc函数

malloc 函数可以从堆上获得指定字节的内存空间,其函数声明如下: 
void * malloc(int n)

其中,形参n为要求分配的字节数。

memset函数的声明如下:

 void * memset (void * p,int c,int n) ;

该函数可以将指定的内存空间按字节单位置为指定的字符c。其中,-

如果要用 memset 清0,变量 c 实参要为0。malloc函数和memset函数的操作语句一般如下:

int * p=NULL;
p=(int *)malloc(sizeof(int));
if(p==NULL)
printf(“Can’t get memory!\n”);
memset(p,0,siezeof(int));
注意:通过malloc函数得到的堆内存必须使用memset函数来初始化。


2. free函数

从堆上获得的内存空间在程序结束以后,系统不会将其自动释放,需要程序员来自己管理。一个程序结束时,必须保证所有从堆上获得的内存空间已被安全释放,否则,会导致内存泄露。

 free 函数可以实现释放内存的功能。其函数声明为:
 void free (void * p);

由于形参为void指针,free函数可以接受任意类型的指针实参

语句前加入以下两行语句:

 free(p);
 p=NULL;
* 注意:使用malloc函数分配的堆空间在程序结束之前必须释放。*


3. calloc函数

  calloc函数的功能与malloc函数的功能相似,都是从堆分配内存。其函数声明如下:
  void *calloc(int n,int size);

函数返回值为void型指针。

  • 该函数与malloc函数的一个显著不同时是,calloc函数得到的内存空间是经过初始化的,其内容全为0。calloc函数适合为数组申请空间,可以将size设置为数组元素的空间长度,将n设置为数组的容量。
* 提示:calloc函数的分配的内存也需要自行释放。*

4. realloc函数

realloc函数的功能比malloc函数和calloc函数的功能更为丰富,
可以实现内存分配和内存释放的功能,其函数声明如下:
 void * realloc(void * p,int n);
  • 指针p必须为指向堆内存空间的指针,即由malloc函数、calloc函数或realloc函数分配空间的指针。
注意:使用malloc函数,calloc函数和realloc函数分配的内存空间都要使用free函数或指针参数为NULL的realloc函数来释放。
注意:如果要使用realloc函数分配的内存,必须使用memset函数对其内存初始化


下面要注意的几点是:

函数malloc()和calloc()都可以用来动态分配内存空间。

  • malloc()函数有一个参数,即分配的内存空间的大小,malloc在分配内存的时候会保留一定的空间用来记录分配情况,分配的次数越多,这些记录占用的空间就越多。另外,根据malloc实现策略的不同,malloc每次在分配的时候,可能分配的空间比实际要求的多些,多次分配会导致更多的这种浪费,当然,这些都跟malloc的实现有关;
  • relloc()可以对给定的指针所指的空间进行扩大或者缩小,无论是扩张或者缩小,原有内存中的内容将保持不变。当然,对于缩小,则被缩小的那一部分的内容会丢失。


malloc()函数用来分配内存:将总共需要的字节数作为参数传递给该函数,返回值是指向最新分配的内存的指针,而如果内存没有分配好,则返回值是NULL。
malloc()的使用:
  some_type *pointer;
  pointer = malloc(count *
  sizeof(*pointer));

注:
(1) 这个方法保证malloc()会分配正确数量的内存,而不用考虑pointer的生命。如果pointer的类型后来变了,sizeof算子自动确保要分配的字节数仍然正确。

(2) malloc()返回的内存是“没有“初始化的。这块内存可能包含任何随机的垃圾,你可以马上用有效数据或者至少是用零来初始化这块内存。要用0初始化,可以用

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

(3) malloc()最终通过缺页异常获取的物理内存中的原有数据,大多数情况下是0(但不能保证一定是0)



calloc()函数是malloc的简单包装。它的主要优点是把动态分配的内存清零。
void *calloc(size_t nmemb,
size_t size);

有经验的程序员更喜欢使用calloc(),因为这样的话新分配内存的内容就不会有什么问题,调用calloc()肯定会清0,并且可以避免调用memset().



memset

代码示例 :

   buffer[] ="Hello world\n";
   printf("没有memset处理之前: %s\n", buffer);
   memset(buffer,  '*' , strlen(buffer) );
   printf("memset处理之后: %s\n", buffer);

输出结果:
没有memset处理之前 : Hello world
memset处理之后:************

上一篇 下一篇

猜你喜欢

热点阅读