动态内存分配是C语言中一个关键概念,它允许程序员在程序运行时动态地分配和释放内存。初学数组时,常常会遇到一个问题:如何在程序中定义数组大小,而不是在函数开始时预先声明一个大数组,仅使用其中的一部分。考虑下面的程序,我们需要一个大小为N(N<1000)的数组,通常我们会这么做:这样做总是感觉绕远路,为什么不能直接使用输入的变量N作为数组大小?比如这样:arr[N]。但遗憾的是,每次编译器都会在程序编译前阻止这种做法。C99标准引入了可以在程序中随时声明变量的动态内存分配,解决了这个问题。如果你不希望使用笨拙的方法,并且没有C99支持的编译器,该怎么办?可以使用`malloc`函数。代码如下:这里`sizeof(int)`代表数组中每个元素的类型,N代表数组元素个数。因此,`malloc(sizeof(int) * N)`意味着向堆区要了一块`sizeof(int) * N`大小的空间。`malloc`与`free`函数是一对好搭档。`malloc`用于分配内存,而`free`用于释放内存。使用`malloc`时,返回一个指向新分配内存的指针,但为了防止内存泄漏,必须使用`free`或`realloc`来释放内存。如果分配失败,`malloc`返回`NULL`。定义:`malloc(size_t size)`用于定义并分配size字节的未初始化内存。如果分配成功,返回对任何拥有基础对齐的对象类型对齐的指针;如果size为零,则`malloc`的行为是实现定义的,例如可以返回空指针。`free(void* ptr)`用于解分配由`malloc`、`calloc`、`aligned_alloc`(C11起)或`realloc`分配的空间。如果不传递空指针,可以减少特例的数量。使用`free`意味着将申请来的空间的首地址还给“系统”,确保在申请到内存后及时归还,防止内存泄漏。关于`malloc`和`free`的常见问题:忘记释放内存会导致内存泄漏,影响程序性能。正确实践是每当使用`malloc`时,相应地使用`free`来释放内存。通过上述介绍,你对C语言中的动态内存分配有了更深入的理解,可以灵活地在程序中管理内存。实践是检验真理的唯一标准,多尝试编写相关代码,加深记忆。