C语言内存分配

内存分配


内存分堆空间与栈空间。栈空间完全操作系统管理:分配与释放。堆空间,在程序启动初始化时,由系统分配一部分,之后在运行过程程,再需要开辟堆空间,就需要手动分配,使用完毕后,需要释放内存,否则就会有内存泄露。

栈内存是有限的,一般就几MB,是在系统环境下一个确认的常数值。而堆内存,理论上可以申请达到系统剩余内存的最大值;实际上,可能没那么大,但至少也有几个GB。下文的内存分配函数,都是分配在堆内存中的。

<stdlib.h>中,提供了四个用于内存分配与释放的函数:

  • malloc 动态分配内存;返回void*
  • calloc 为一组目标动态分配内存,并将分配后的内存空间初始化;返回void*
  • realloc 重新分配内存;返回void*
  • free 释放内存

malloc


void *malloc(size_t __size); 返回void指针,即任意类型指针。

这里的size_t,实际上是一个unsigned long类型;参数__size,用于指定分配的内存字节数

1
2
3
4
int *p = malloc(sizeof(int));
*p = 100;
printf("%d\n", *p);
free(p);

calloc


void *calloc(size_t __count, size_t __size); 返回void指针,即任意类型指针。

这里的__count表示,要分配的item数量,每个item的所占的内存字节数由__size指定。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
int len = 3;
int *p = calloc(len, sizeof(int));
for (int i = 0; i < len; ++i) {
p[i] = i * 50;
printf("%d\n", p[i]);
}
//使用指针方式遍历
for (int i = 0; i < len; ++i) {
printf("%d\n", *p);
p++;
}
free(p);

realloc


void *realloc(void *__ptr, size_t __size); 为指针__ptr重新分配内存为__size

free


void free(void *); 释放动态分配的内存

------ 本文结束 ------

版权声明
协议:No Fuck License

stone 创作并维护
本文首发于 stone世界 博客( http://stone86.top
版权所有,侵权必究。如要转载,请声明出处

Fork me on GitHub