📜  C中静态和动态内存分配的区别(1)

📅  最后修改于: 2023-12-03 15:14:25.460000             🧑  作者: Mango

C中静态和动态内存分配的区别

在C语言中,静态内存分配和动态内存分配是两种常见的内存分配方式。本文将介绍这两种内存分配方式的区别以及它们的使用场景。

静态内存分配

静态内存分配是指在程序编译时将内存分配给变量或数据结构,并在程序运行时一直存在。静态内存分配的变量在程序启动时就被分配,并一直存在于内存中,直到程序结束。

在C语言中,静态内存分配有两种方式:全局变量和静态变量。

全局变量

全局变量是在程序的任意函数外定义的变量。全局变量有以下特点:

  • 全局变量在整个程序运行期间都是存在的。
  • 全局变量至少占用一个程序文件的内存。
  • 全局变量具有默认值(如果未初始化)。

下面是一个定义全局变量的例子:

#include <stdio.h>

int global_var;

int main()
{
    printf("%d\n", global_var); // 输出默认值0
    global_var = 10;
    printf("%d\n", global_var); // 输出10
    return 0;
}
静态变量

静态变量是在函数内定义的变量,并在函数调用结束后不会被销毁。静态变量有以下特点:

  • 静态变量在程序运行期间都是存在的。
  • 静态变量只能在定义它的函数内部使用,不能在其他函数中使用。
  • 静态变量具有默认值(如果未初始化)。

下面是一个定义静态变量的例子:

#include <stdio.h>

void func()
{
    static int static_var;
    printf("%d\n", static_var); // 输出默认值0
    static_var = 20;
    printf("%d\n", static_var); // 输出20
}

int main()
{
    func();
    func();
    return 0;
}
动态内存分配

动态内存分配是指在程序运行时根据需要动态地分配内存。动态内存分配的内存在程序的某个函数中使用,并在函数调用结束时被释放。动态内存分配使用malloc函数分配内存,在使用完内存后使用free函数释放内存。

malloc函数

malloc函数用于动态分配指定长度的内存,并返回分配的内存的起始地址。malloc函数的声明如下:

void * malloc(size_t size);

其中,size参数表示需要分配的内存大小,以字节数为单位。malloc函数返回分配的内存的起始地址,或NULL表示分配失败。

下面是一个使用malloc函数动态分配内存的例子:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int *p = (int *)malloc(sizeof(int)); // 分配4个字节的内存
    if (p == NULL)
    {
        printf("内存分配失败\n");
        return -1;
    }
    *p = 10;
    printf("%d\n", *p); // 输出10
    free(p); // 释放内存
    return 0;
}
free函数

free函数用于释放使用malloc函数分配的内存。free函数的声明如下:

void free(void *ptr);

其中,ptr参数为使用malloc函数分配的内存的起始地址。

下面是一个使用free函数释放内存的例子:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int *p = (int *)malloc(sizeof(int)); // 分配4个字节的内存
    if (p == NULL)
    {
        printf("内存分配失败\n");
        return -1;
    }
    *p = 10;
    printf("%d\n", *p); // 输出10
    free(p); // 释放内存
    printf("%d\n", *p); // 内存已经释放,输出是不确定的
    return 0;
}
静态内存分配和动态内存分配的区别

静态内存分配和动态内存分配的区别如下:

  • 静态内存分配在程序编译时就完成了,动态内存分配在程序运行时完成。
  • 静态内存分配的变量一直存在于内存中,动态内存分配的内存在程序执行完毕后被释放。
  • 静态内存分配的变量的大小在编译时就确定了,动态内存分配的内存大小在运行时才确定。
  • 静态内存分配的变量不需要手动释放,动态内存分配的内存需要手动释放。
使用场景

静态内存分配和动态内存分配各有适用的场景。一般来说,静态内存分配用于存储不变的数据,动态内存分配用于存储需要经常变化的数据。

静态内存分配适用于以下场景:

  • 存储不变的数据,如常量、配置参数等。
  • 存储大小固定的数据结构,如数组、结构体等。

动态内存分配适用于以下场景:

  • 存储大小不确定的数据结构,如链表、树等。
  • 存储需要动态增加和减少的数据,如读取文件时需要动态分配的缓冲区等。
总结

本文介绍了C语言中静态内存分配和动态内存分配的区别以及它们的使用场景。在实际编程中,我们需要根据实际情况选择合适的内存分配方式,以保证程序的正确性和效率。