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

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

C语言中的静态和动态内存分配

在C语言中,内存分配是一个非常重要的概念,因为它直接涉及到程序的性能、可靠性和安全性。C语言中的内存分配可以分为静态内存分配和动态内存分配。

静态内存分配

静态内存分配是在编译时将变量的内存分配在程序的全局数据区或静态数据区,这些区域的内存由编译器在程序编译时就分配好,并在程序的整个生命周期中一直保持不变。

静态内存分配的变量称为静态变量,它们具有全局作用域,并且可以在任何函数中访问。静态变量分为两种类型:全局静态变量和局部静态变量。

全局静态变量在函数外定义,它们的内存分配在程序的全局数据区中。全局静态变量的默认值为0,如果没有显式的赋值语句,它们在程序启动时就会被自动初始化为0。

局部静态变量在函数内定义,但是在变量定义前加上static关键字,这样它们的内存分配同样在程序的全局数据区中。局部静态变量只能在函数内访问,但在函数调用结束时,它们的值不会被销毁,而是保留在程序的全局数据区中,直到程序终止。

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

#include <stdio.h>

int global_var;   // 全局静态变量
static int static_var;   // 局部静态变量,只能在该函数内访问

void func() {
    int local_var;    // 局部变量,只能在该函数内访问
    static int static_local_var;   // 局部静态变量,只能在该函数内访问
}

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

动态内存分配是在程序运行时根据需要分配内存。动态内存分配使用malloc和free函数来完成。

malloc函数用于分配指定大小的内存,其原型如下:

void* malloc(size_t size);

该函数返回一个指向已分配内存的指针,如果分配失败则返回NULL。

free函数用于释放通过malloc函数分配的内存,其原型如下:

void free(void* ptr);

ptr是指向被释放内存的指针,它必须是通过malloc函数分配的指针。

下面是一个动态内存分配的例子:

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

int main() {
    int* ptr;
    ptr = (int*) malloc(10 * sizeof(int));   // 分配10个整型的内存空间
    
    if (ptr == NULL) {
        printf("动态内存分配失败\n");
        exit(1);
    }
    
    // 使用分配的内存空间
    for (int i = 0; i < 10; i++) {
        ptr[i] = i;
    }
    
    // 释放分配的内存空间
    free(ptr);
    
    return 0;
}
动态内存分配的注意事项

使用动态内存分配时需要注意以下事项:

  • 内存泄漏:如果在使用完动态分配的内存空间后没有通过free函数释放,就会导致内存泄漏,使程序浪费系统资源。
  • 空指针:如果分配内存失败,malloc函数会返回NULL,如果没有对返回值进行判断,在使用指针时就会出现空指针异常。
  • 缓冲区溢出:分配的内存空间必须足够大,以容纳所有需要存储的数据,否则就会发生缓冲区溢出,导致程序崩溃或者数据被破坏。
总结

C语言中的内存分配分为静态内存分配和动态内存分配。静态内存分配是在编译时分配内存,对于全局和局部静态变量,它们的内存分配在程序的全局数据区中,而在函数内声明的普通变量则在堆栈中分配内存。动态内存分配是在程序运行时根据需要分配内存,通过malloc函数分配内存,通过free函数释放内存。使用动态内存分配时需要注意内存泄漏、空指针和缓冲区溢出等问题。