一般的内存区域可以分为堆(heap), 栈(stack), 静态存储区(全局),常量存储区还有程序代码区。其中
-
栈 – 由编译器自动分配释放,用于存放函数的参数值和局部变量等
-
堆 – 由程序员进行分配释放
-
静态存储区 – 全局变量和静态变量的存储区。初始化完成变量在一块区域,未进行初始化的在其相邻的区域。由程序负责释放
-
常量存储区 – 存储常量
C中提供了许多函数来完成堆上内存的管理,比方说calloc()
和malloc()
malloc()
void *malloc(int n)
可以从堆上获得指定字节的内存空间。其中n为分配的字节数,一般情况下会使用sizeof()
函数来获取单位大小。函数执行成功的话,会返回内存空间的首地址,如果执行失败的话,返回值为NULL。由于其类型为void型指针,因此可以将其值类型转换后赋给任意类型的指针。从而操作堆上的内存空间
calloc()
void *calloc(int n, int size)
功能与malloc()
类似都是从堆上分配内存。与malloc()
的区别在于,malloc()
分配获取的空间是未进行初始化的,还需要调用memset()
来将其初始化为0.而calloc()
得到的内存空间是经过初始化的,其内容全为0.所以比较适合用于为数组申请空间,可以将size
设置为数组元素的空间长度,n为数组的容量
free()
void free(void *p)
释放指针所指向的内容,但是该指针仍然指向原来指向的地方,所以在释放之后,需要将指针设为NULL