C语言中的内存分配策略主要有动态内存分配和静态内存分配两种。静态内存分配在程序编译时就已经确定了内存大小,而动态内存分配则是运行时根据需要动态调整分配大小。
malloc和calloc都是动态内存分配函数,它们通常在堆(heap)上分配内存。堆是由操作系统管理的一块内存空间,程序可以在运行时使用malloc和calloc在堆上申请内存。malloc只分配内存而不初始化,calloc则分配内存并且将初始化为0。另外,C语言也提供了静态内存分配方式,如全局变量和静态变量都是在程序编译过程中就已经确定分配的内存。
与堆不同的是,栈(stack)是一种内存分配方式,用于程序调用函数时临时存储参数、返回值和局部变量等数据。栈大小在程序编译时确定,栈顶指针会向着栈底移动,而当程序退出当前函数时,栈顶会恢复原位置。C语言中,所有非静态局部变量和函数参数都是在栈上分配的。
相比静态内存分配,动态内存分配拓展了程序使用内存的能力,也增加了程序的灵活性。但使用动态内存分配也要注意内存泄漏和内存碎片等问题。而堆和栈的区别在于其内存分配和释放方式的不同,程序员需要根据实际情况选择合适的内存分配方式。