C语言分配内存

本文介绍了C语言中的动态内存分配,包括malloc、free和calloc的使用。重点讨论了内存泄漏问题及其危害,并概述了静态存储类别和自动存储类别。动态分配内存允许在程序运行期间灵活地创建和释放内存块,但也可能导致内存碎片。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C语言分配内存

首先说基础:

  • malloc:申请内存
    • 参数:申请内存所需要的字节
    • 返回参数:void*类型的指针,如果申请内存失败,就会返回空指针
  • free:释放内存
    • 参数:申请到的地址,即上面返回的指针
    • 返回参数:无
  • calloc:作用和 malloc 类似,就是参数不同

下面就是借用这个内存分配演示一下生成动态数组:

#include "stdio.h"
#include "stdlib.h"

int main(){
    int arrayLength;
    if (scanf("%d",&arrayLength)!=1){
        printf("Wrong Input\n");
        exit(EXIT_FAILURE);
    }
    char* inputString;
    // 申请内存
    inputString=(char*)malloc(arrayLength* sizeof(char));
    for (int i = 0; i <= arrayLength; ++i) {
        scanf("%c",&inputString[i]);
    }
    for (int i = 0; i <= arrayLength; ++i) {
        printf("%c\n",inputString[i]);
    }
    // 释放内存
    free(inputString);
}

内存泄漏 / memory leak

简单点来说就是在一直申请内存但是没有释放,直到所有内存都被占用:

#include "stdio.h"
#include "stdlib.h"

char* createArray(unsigned int arrayLength);

int main(){
    char* addresses[100];
    for (int i = 0; i < 100; ++i) {
        // 这里一直在申请内存
        addresses[i]= createArray(100);
    }
    /**
     * 下面的代码就是在释放内存了
    for (int i = 0; i < 100; ++i) {
        free(addresses[i]);
    }
    **/
}

char* createArray(unsigned int arrayLength){
    return malloc(arrayLength*sizeof(char));
}

存储类别

静态存储类别

类似于静态存储期一样的效果。

自动存储类别

类似于自动存储期一样的效果。

动态分配内存

这个就是上面讲的。这部分的好处就是可以跳出存储期的概念,比如这部分在某个函数中生成,再到某个函数中去释放,比如:

#include "stdio.h"
#include "stdlib.h"

char* createArray(unsigned int arrayLength);
void freeArray(char* address[]);

int main(){
    char* addresses[100];
    for (int i = 0; i < 100; ++i) {
        // 这里一直在申请内存
        addresses[i]= createArray(100);
    }
    freeArray(addresses);
}

char* createArray(unsigned int arrayLength){
    // 像这种变量就会在函数执行完之后被自动销毁
    int temp=arrayLength;
    return malloc(arrayLength*sizeof(char));
}

void freeArray(char* address[]){
    int i=0;
    while (address[i]){
        free(*address[i]);
        i++;
    }
}

但是这样导致的结果后果也有,就是内存地址会变成一块一块不连贯的存在。比如你在函数A中申请了1-100的内存,在函数2中申请了101-130的内存,之后你释放掉了1-100的内存,再重新申请了1-30的内存,于是你的内存块就变成了:

  • 1-30:在使用
  • 31-100:闲置
  • 101-130:在使用

这样当你要申请80的内存块时,就必须不断往后去申请。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值