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

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

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

C语言中的内存分配包括静态内存分配和动态内存分配两种方式。

静态内存分配

在程序编译时,系统会为全局变量和静态变量分配内存空间。静态内存分配的好处是可以提高程序的运行效率,因为静态内存不需要手动分配和释放,一旦分配好,就会一直存在程序的整个生命周期内。

静态内存分配的代码示例:

int global_var; //全局变量,存储在静态内存中
static int static_var; //静态局部变量,存储在静态内存中

void func(){
    static int static_var2; //静态局部变量,存储在静态内存中
    int local_var; //局部变量,存储在栈内存中
}
动态内存分配

动态内存分配指的是程序在运行过程中根据需要手动分配内存空间的过程。C语言提供了malloc()calloc()realloc()三个函数用于动态内存分配,并提供了free()函数用于释放已经分配的内存空间。

malloc()

函数原型:void* malloc(size_t size);

函数作用:在内存堆中分配一块大小为size的无类型内存空间,并返回内存空间的首地址。

示例代码:

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

int main(){
    int *ptr;
    ptr = (int*)malloc(4 * sizeof(int)); //分配4个int类型的内存空间
    
    if(ptr == NULL){
        printf("动态内存分配失败!\n");
    }else{
        printf("动态内存分配成功!\n");
    }
    
    free(ptr); //释放分配的内存空间
    return 0;
}
calloc()

函数原型:void* calloc(size_t n, size_t size);

函数作用:在内存堆中分配一块大小为n*size的无类型内存空间,并返回内存空间的首地址。分配出的内存空间,其每个字节都被初始化为零。

示例代码:

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

int main(){
    int *ptr;
    ptr = (int*)calloc(4, sizeof(int)); //分配4个int类型的内存空间,并将每个字节都初始化为零
    
    if(ptr == NULL){
        printf("动态内存分配失败!\n");
    }else{
        printf("动态内存分配成功!\n");
    }
    
    free(ptr); //释放分配的内存空间
    return 0;
}
realloc()

函数原型:void* realloc(void* ptr, size_t new_size);

函数作用:重新分配之前ptr指向的内存空间,并改为大小为new_size。如果改变成功,将返回指向新分配内存空间的指针;如果改变失败,将返回NULL

示例代码:

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

int main(){
    int *ptr;
    ptr = (int*)malloc(2 * sizeof(int)); //分配2个int类型的内存空间
    ptr[0] = 1;
    ptr[1] = 2;
    
    ptr = (int*)realloc(ptr, 4 * sizeof(int)); //重新分配4个int类型的内存空间
    ptr[2] = 3;
    ptr[3] = 4;
    
    for(int i=0; i<4; i++){
        printf("%d ", ptr[i]);
    }
    printf("\n");
    
    free(ptr); //释放分配的内存空间
    return 0;
}
free()

函数原型:void free(void* ptr);

函数作用:释放之前动态分配的内存空间。

示例代码:

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

int main(){
    int *ptr;
    ptr = (int*)malloc(4 * sizeof(int)); //分配4个int类型的内存空间
    
    if(ptr == NULL){
        printf("动态内存分配失败!\n");
    }else{
        printf("动态内存分配成功!\n");
    }
    
    free(ptr); //释放分配的内存空间
    return 0;
}
总结

静态内存分配和动态内存分配各有优缺点,需要根据具体情况进行选择。静态内存分配适用于需要长时间保存的变量和数组,而动态内存分配则适用于需要临时占用内存空间的情况。在使用动态内存分配时,需要注意及时释放已经不需要的内存空间,以免出现内存泄漏等问题。