C语言动态内存分配

本文介绍了C语言中动态内存分配的重要概念,包括malloc函数的两种使用方式和free函数的正确使用。强调了动态内存必须手动释放,malloc与free需成对出现,释放后应将指针置为NULL,避免内存泄漏。

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

学数据结构一开始就会遇到这样的语句
int *a = (int*)malloc(n*sizeof(int));

但仅仅知道而不理解是不可行的,还要明白动态分配用法。


适用情况:

  • 数组的长度必须事先指定,而且只能是常量,不能是变量。
  • 比如像下面这么写就是对的:
int a[5];
  • 而像下面这么写就是错的:
int length = 5;
int a[length];  //错误
  • 因为数组长度只能是常量,所以它的长度不能在函数运行的过程当中动态地扩充和缩小。

一,malloc函数的使用

方式一:

int *p = (int *)malloc(8);

方式二:(推荐用这种方式,可移植性高)

int *p = malloc(sizeof(int));
//或者
int *a = (int*)malloc(n*sizeof(int)); //这里的n后的*表示乘法,不是指针

这个例子就是请求系统分配 8 字节的内存空间,并返回第一字节的地址,然后赋给指针变量 p。当用 malloc 分配动态内存之后,上面这个指针变量 p 就被初始化了


malloc函数的原型:

# include <stdlib.h>
void *malloc(unsigned long size);

其中void和void*的区别:

  • void* 是定义一个无类型的指针变量
  • void 是无返回值
# include <stdio.h>
# include <stdlib.h> //malloc()的头文件
void Mul(int *i);  //函数声明
int main(void)
{
    int *p = malloc(4);
    *p = 2;
    Mul(p); //注意是传p,不是*p
    printf("*p = %d\n", *p);
    return 0;
}
void Mul(int *i)
{
    *i = (*i) * 10;
    return;
}

在这里插入图片描述

解释:
指针变量 p 中的地址被传递给指针变量 i (注意是传p,不是*p)
此时 i 和 p 指向的是同一个内存单元,指向单元的值为2
所以操作 i 所指向的内存空间就是操作 p 所指向的内存空间。


下面这是一个无限申请空间分配的程序,每次请求申请1024字节空间,会导致电脑内存泄漏从而死机

# include <stdio.h>
# include <stdlib.h>  //malloc()的头文件
int main(void)
{
    while (1)
    {
        int *p = malloc(1024);   
    }
    return 0;
}

二,free函数的使用

动态分配的内存空间是由程序员手动编程释放的!

free函数用法:

//假设定义了指针p
free(p)

free 函数的原型是:

# include <stdlib.h>
void free(void *p);

注意:

  • free 函数无返回值,它的功能是释放指针变量 p 所指向的内存单元。
  • 释放并不是指清空内存空间,而是指将该内存空间标记为“可用”状态
  • 指针变量 p 被释放之后,它仍然是指向那块内存空间的,但那块内存空间已经不再属于它,该内存空间可能会被分配给其他变量使用
  • 释放空间后,相应空间内的值不一定准确,不同编译器结果不同

举例:

# include <stdio.h>
# include <stdlib.h>
int main(void)
{
    int *p = malloc(sizeof*p);
    *p = 20;
    printf("p = %p\n", p);
    free(p);
    printf("p = %p\n", p);
    return 0;
}
***

在这里插入图片描述

malloc 和 free 一定要成对存在,并且一一对应。有几个 malloc 就要有几个 free,且一个动态内存只能释放一次。每释放一个指向动态内存的指针变量后要立刻把它指向 NULL。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值