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

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

C语言中静态和动态内存分配之间的区别

在C语言中,内存分为静态内存和动态内存。静态内存是由编译器在程序编译时为程序的全局变量和静态变量分配的内存空间,而动态内存则是由程序在运行时根据需要动态分配的。

静态内存分配

静态内存分配是在程序编译时由编译器自动为程序的全局变量和静态变量分配内存空间。这些变量在程序整个运行过程中都存在并保持不变。静态内存分配的优点是简单易用,不需要程序员手动管理内存的分配和释放,但缺点是分配的内存空间无法动态改变,在程序运行过程中可能会浪费内存资源。

示例代码
#include <stdio.h>

int global = 100;         // 全局变量,静态内存分配

void staticMemoryAllocation() {
    static int staticVar = 50;     // 静态变量,静态内存分配
    printf("global variable value is %d\n", global);
    printf("static variable value is %d\n", staticVar);
}

int main() {
    staticMemoryAllocation();
    staticMemoryAllocation();
    staticMemoryAllocation();
    return 0;
}

输出结果:

global variable value is 100
static variable value is 50
global variable value is 100
static variable value is 50
global variable value is 100
static variable value is 50
动态内存分配

动态内存分配是在程序运行时根据需要动态分配的内存空间,称为堆内存。动态内存分配需要程序员手动管理内存的分配和释放过程,能够有效地避免浪费内存资源。但是,如果程序员不注意内存的释放,可能会导致内存泄漏问题。

动态内存分配函数

动态内存分配使用的函数有malloc()、calloc()和realloc()。它们的头文件均为stdlib.h。

  • malloc()函数:用于动态分配指定大小的内存空间,返回值为指向该内存空间的指针。如果分配失败,返回NULL。
  • calloc()函数:用于动态分配指定个数和大小的内存空间,并将该内存空间全部初始化为0,返回值为指向该内存空间的指针。如果分配失败,返回NULL。
  • realloc()函数:用于调整已经分配的内存空间大小。返回值为指向该内存空间的指针,如果调整失败,返回NULL。需要注意的是,如果返回的指针与原先指针不同,则需要释放原来的内存空间,否则会导致内存泄漏。
示例代码
#include <stdio.h>
#include <stdlib.h>

void dynamicMemoryAllocation() {
    int *p = NULL;      // 定义指向整型的指针
    p = (int *) malloc(sizeof(int));    // 动态分配整型变量的内存空间
    if (p == NULL) {
        printf("dynamic memory allocation failed\n");
        return;
    }
    *p = 100;           // 向动态分配的内存赋值
    printf("the value of variable p is %d\n", *p);
    free(p);            // 释放动态分配的内存空间
}

int main() {
    dynamicMemoryAllocation();
    return 0;
}

输出结果:

the value of variable p is 100
静态内存和动态内存的区别
  • 静态内存分配是在程序编译时完成的,动态内存分配是在程序运行时根据需要动态分配的。
  • 静态内存分配的变量在程序整个运行过程中都存在,动态内存分配的变量可以根据需要动态分配和释放。
  • 静态内存分配由编译器自动完成,程序员无需手动管理内存的分配和释放,动态内存分配需要程序员手动管理内存的分配和释放。
  • 静态内存分配的缺点是分配的内存空间无法动态改变,在程序运行过程中可能会浪费内存资源,动态内存分配能够避免浪费内存资源,但需要程序员手动管理内存的分配和释放过程。
总结

动态内存分配能够灵活地管理内存空间,避免浪费内存资源。但需要程序员手动管理内存的分配和释放过程,避免内存泄漏问题。静态内存分配虽然简单易用,但如果需要动态改变分配的内存空间,需要重新编译程序。因此,在实际编程过程中应根据具体情况选择不同的内存分配方式。