关于malloc函数

上课时候马马虎虎没听懂,现在重新理解一下。

malloc也就是memory 内存 allocate 分配,也就是动态分配内存

传统静态分配内存:

  1. 数组需要提前声明数组长度,且长度为常量,例int a[5]
  2. 传统数字,不能手动释放,只能等待系统自动释放,静态分配的变量在该函数内运行的时候有效,当静态分贝的变量所在函数运行完之后,该内存会自动释放。(好像听起来不错)静态分配的内存,是在栈中分配,调用也是一样,而栈的特点是先进后出。
  3. 传统数组的长度定义后就改不了,存在不够用或者浪费空间问题。

动态分配内存:

malloc原型函数:void * malloc(int size)
malloc调用函数:(指针类型*)malloc(sizeof(指针类型))
free函数说明:free函数 释放 malloc函数 给 指针变量 分配的内存空间;使用后该指针变量一定要重新指向NULL,防止悬空指针(失效指针)出现,有效规避错误操作。

malloc就是一个可以动态分配内存的函数。

  1. malloc被调用时,它会沿着空闲链表寻找一个可以满足需求的内存块,然后把所需大小的内存块分配给用户,剩下的返回到链表上,free函数被调用时,它将释放的内存块练到空闲链表。
  2. 用于申请一块连续的指定大小的内存块区域以void*类型返回分配的内存区域地址;如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL。在使用malloc开辟空间时,使用完成一定要释放空间,如果不释放会造内存泄漏。
  3. 在使用malloc函数开辟的空间中,不要进行指针的移动,因为一旦移动之后可能出现申请的空间和释放空间大小的不匹配。
  4. 需要包含一个头文件#include<malloc.h>

举例:

int *p;
p=(int *)malloc(sizeof(int));
  • int* p代表一个以int类型地址为内容的指针变量,p这个变量占4个字节,malloc函数返回的是void *类型,如果你写成:p = malloc(sizeof(int));则程序无法通过编译,报错:“不能将void *赋值给int *类型变量”。所以必须通过(int *)来强制类型转换.
  • 函数的实参为sizeof(int),用于指明一个整形数据需要的大小,如果你写成     int * p =(int *)malloc(1);      代码也能通过编译,但事实上只分配了1个字节大小的内存空间,当你往里面存入一个整数时,会有3个字节无家可归,而直接“住进领居家”!造成的后果是后面的内存中原有数据内用全部被清空。
int* p = (int *) malloc ( sizeof(int) * 100);

//分配可以放得下100个整数的内存空间

结构体动态分配(参考某博主)

typedef struct data_type
{
    int age;
    char name[20];
} data;
 
data *bob = NULL;
// 定义一个指针,指向NULL
bob = (data *)malloc(sizeof(data));
// 内存分配
 
if (bob != NULL) // 检测内存是否分配成功
{
    bob->age = 22;
    strcpy(bob->name, "Robert");
 
    printf("%sis%dyearsold\n", bob->name, bob->age);
}
else
{
    printf("mallocerror!\n");
    exit(-1);
}
free(bob);  // 释放内存
bob = NULL; // 内存指向NULL

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值