---------------------------------------------------------------------------------------------------------------------
1、栈
在全局变量是分配在内存中的静态储存区,非静态的局部变量是分配在内存中的动态储存区,这个储存区就是栈的区域。
2、堆
在内存中允许建立内存动态分配区域,以存放一些临时用的数据,这些数据不必声明部分定义,也不必等到函数结束时才释放,需要时可以随时开辟,不需要时随时释放。这些数据临时存放在一个特别的自由储存区,就是堆区。只能通过指针来引用。
现在我们已学了两种开辟空间的方式,其一:int a = 0;这种一次开辟一小块空间,其二:int arr[10] = { 0 };这种一次开辟一大块空间。但这两种开辟方式是有局限性的,一旦开辟就无法再更改开辟空间的大小了。
举个例子:现创建了一个结构体数组,数组每个元素都是一个人的信息,而该数组能存放100个人的信息。但我仅需要存放3个人的信息,对于这个结构体数组来说,剩余的97个空间不就浪费了嘛;同理我需要存放120个人的信息,对于该数组来说是放不下的,而我又不能对其大小进行修改。
这两种开辟空间的方式是在栈区上开辟;栈区中申请的空间是固定死的无法修改。而动态内存是在堆区开辟空间。
对于内存的动态分配管理,包括动态内存函数:malloc、calloc、realloc、free。要使用这几个函数就必须先引用一个头文件<stdlib.h>才行。
3、malloc
在C语言中提供了动态内存分配的函数:
void* malloc(size_t size)
通过malloc函数,可以在堆区申请一块连续可用的空间供我们使用。
size ——表示我们要开辟多大的一块内存空间(单位是字节)。
该函数返回一个指针,指向已分配大小的内存。如果请求失败,则返回 NULL。
注意:
malloc内的参数是需要动态分配的字节数,而不是可以存储的元素个数!
当动态分配内存时,存储的是字符型数据,每个元素1字节,所以字节数刚好等于需要存储的元素个数(字符数+1);
如果存储的是整型或浮点型数据,字节数等于“需要存储的元素个数 * 一个元素的字节数”,
代码格式为:
type *var_name = (type*)malloc(sizeof(type)*num);
标签:malloc,字节数,菜鸟,C语言,内存,动态内存,储存区,开辟 From: https://www.cnblogs.com/ZYL-FS/p/17727399.html