c - 静态内存分配和动态内存分配的区别

标签 c memory memory-management dynamic-memory-allocation static-memory-allocation

我想知道静态内存分配和动态内存分配有什么区别?

你能用任何例子来解释这一点吗?

最佳答案

共有三种类型的分配——静态、自动和动态。

静态分配意味着,您的变量的内存在程序启动时分配。创建程序时大小是固定的。它适用于全局变量、文件范围变量和用 static 限定的变量。在函数内部定义。

自动内存分配发生在函数内部定义的(非静态)变量,并且通常存储在堆栈中(尽管 C 标准不强制要求使用堆栈)。您不必使用它们保留额外的内存,但另一方面,对这些内存的生命周期的控制也很有限。例如:函数中的自动变量只存在于函数完成之前。

void func() {
    int i; /* `i` only exists during `func` */
}

动态内存分配有点不同。您现在可以控制这些内存位置的确切大小和生命周期。如果不释放它,就会遇到内存泄漏,这可能会导致应用程序崩溃,因为在某个时间点,系统无法分配更多内存。
int* func() {
    int* mem = malloc(1024);
    return mem;
}

int* mem = func(); /* still accessible */

在上面的示例中,即使函数终止,分配的内存仍然有效且可访问。当你用完内存后,你必须释放它:
free(mem);

关于c - 静态内存分配和动态内存分配的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8385322/

相关文章:

C - 使用双指针动态内存分配

c - 哪些宽字符被翻译成空多字节?

ios - 内存泄漏从服务器下载图像

android - 显存和安卓应用

java - 使用 64 位 Java 编写服务器是否会因 JVM 堆大小/内存而受到阻碍?

c - 拦截系统调用时无法处理 X 处的内核分页请求

C 编程 - 数组的大小

c++ - 动态创建的字符串分配在堆或堆栈上 - C

android - 如何使用 NDK 查找我的 C++ 编写的 Android 应用程序的内存使用情况

c# - 引发/生成空引用异常背后的CLR实现是什么?