c语言动态申请内存(malloc与calloc)

malloc与calloc

1.函数原型

   #include<stdlib.h>

   void *malloc(unsigned int size);     //申请size字节的内存

   void *calloc(unsigned int num, unsigned size);    //申请num*size字节的内存

2.函数的返回值为void*类型,使用时需强制转换为所需要的类型;

   如果内存申请失败,则返回NULL,所以使用申请到的内存时需要先进行判断。

   如:char* p = (char*)malloc(6 * sizeof(char));

3.申请的内存位于堆中,不再需要使用时,需调用free函数释放

   void free(void *p);

注意:

1.void *与NULL是完全不同的两个概念

  int *p=NULL;

  void *p;

2.malloc与数组的比较:

(1)传给malloc函数的实参可以是一个表达式,从而可以“动态”申请一块内存;

(2)使用malloc函数申请的内存(存放在堆中,在手动释放之前会一直存在)可以从函数中返回;而使用数组则不可以(存放在栈中,当函数执行结束后,栈内存被释放),示例代码如下:

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 int main()
 4 {
 5     char* func1();
 6     char* func2();
 7     char* pf1;
 8     char* pf2;
 9     pf1 = func1();
10     pf2 = func2();
11     printf("%s\n", pf1);    //输出f1
12     printf("%s\n", pf2);    //输出乱码,错误信息-返回局部变量的地址
13 }
14 
15 char* func1()
16 {
17     char* p = (char*)malloc(3 * sizeof(char));
18     if (p)
19     {
20         p[0] = 'f';
21         p[1] = '1';
22         p[2] = '\0';
23         return p;
24     }
25     return NULL;
26 }
27 
28 char* func2()
29 {
30     char p[3] = "f2";
31     return p;
32 }

 

posted @ 2019-07-31 16:31  奔_gis  阅读(3190)  评论(0编辑  收藏  举报