C语言——malloc与free

本文详细探讨了C语言中malloc内存分配、calloc动态初始化和free释放的原理,包括size_t类型的应用、避免溢出技巧、一维数组使用、calloc的特性以及内存安全实践。特别强调了正确释放内存以防止内存泄漏和资源浪费。

1. malloc

  • 在堆区申请一个指定大小、连续的空间并返回空间地址

(int*)malloc(4);
// 申请了一个四个字节的空间并且规定该空间为一个int型变量空间,而不是别的。

int *p =(int*)malloc(4);
// 由于malloc返回一个 空间地址,所以需要一个相应类型的指针来接收改地址

int *p;
p=(int*)malloc(4);
//也可以分写

1.1 size_t

1.2 malloc可申请的字节数

2G=210241024*1024个字节

1.2.1 整形常量溢出

例如int类型是-231~231个字节


int *p=(int*)malloc(2*1024*1024*1024);
//超出int型的容积,会出现常量溢出的警告 

int *p=(int*)malloc(2*1024*1024*1024-1);
当把申请空间减去一部分是,由于先算乘法,再算加法,第一次乘法溢出,第二次用一个溢出的数再去运算还是溢出,会报两次溢出警告

两种解决方法


int *p=(int*)malloc(2u*1024u*1024u*1024u);
加上u变成无符号的整形,范围是0~2^32个字节

还可以申请多次
int *p1=(int*)malloc(1024*1024*1024);
int *p2 =(int*)malloc(1024*1024*1024);

  • 当你申请了一个3个字节的空间,并把这个空间给了一个int型,因为int型为4字节,少了一个字节,

int *p = (int*)malloc(3);
free(p);
//当释放p空间的时候会出现错误,控制台光标卡在释放空间的位置

  • 当p被赋值给一个地址,就不要给他在赋值另一个地址了。原地址会被后赋值的地址覆盖掉,但是原地址不会被释放,但是也找不到他,就造成了内存的丢失。

int *p = (int*)malloc(4);
p = (int*)malloc(4);  // 原地址会被覆盖掉,造成内存丢失

whil(1)
{
    malloc(4);
    // 当他不断地运行下去,你电脑的内存就会不断地变小
}

  • malloc申请的空间在关闭程序的时候会自动关闭,但是运行的服务器几乎不会关机,所以需要free来释放空间。但是在自己编程的过程中,不用的空间一定要马上释放。

1.3 malloc一维数组


堆区申请内存
int *p=malloc(sixeof(int)*5);  //申请了5个int类型的空间

栈区申请内存
int a[5];
int *p=&a[0];

  • 一维数组指针空间申请

int (*p)[5]=(int (*)[5])malloc(4*5);
//(*)[5]必须要这么写,这样是数组指针,如果写成*[5],只是指针数组
int a[5];
int (*p)[5]=&a;

free(p);

1.4 calloc

与malloc的功能相似,申请一段空间数组,但是calloc在申请空间的同时就自动的给申请的空间赋值为0。


int *p=(int*)calloc(5,4)// 5代表要申请的空间个数,4代表每个空间的大小。

free(p);

relloc
修改申请空间的大小


int *p=(int*)malloc(12);  //为p申请了一个12个字节的地址 
int *p1=(int*)realloc(p,20); //


free(p)

2. free

释放某个地址空间的,被释放的地址的值不是0,而是某个初始值。


int *p = (int*)malloc(4);
*p=12;

free(p);

  • 内存地址是不能重复释放的,会出现崩溃

  • 不能释放栈区空间,会出现崩溃

### C语言中`malloc`函数的使用 在C语言编程环境中,动态内存分配是一项重要的功能,它允许程序运行时根据需求申请所需大小的空间。对于`malloc`而言,其主要作用是从堆(heap)上分配指定数量的字节,并返回指向这块新分配空间的第一个字节地址的指针[^1]。 #### 函数声明参数说明 `malloc`的标准形式如下所示: ```c void* malloc(size_t size); ``` 这里`size_t`是一个无符号整型数据类型,在不同平台上可能具有不同的位宽,但它总是足够大以容纳任何对象尺寸。当调用此函数时,需传入想要获取的存储单元数目作为唯一参数——即希望获得多少个连续可用的字节数量[size][^2]。 #### 返回值解释 成功执行后,该操作会返回一个指向已初始化为零或者未定义状态的新近开辟区域起始位置(`void *`);如果请求失败,则返回NULL来指示错误情况的发生[^3]。 #### 实际应用案例分析 下面给出了一段简单演示如何利用`malloc`创建数组并释放资源的例子: ```c #include <stdio.h> #include <stdlib.h> int main(){ int length; printf("请输入您想建立的一维整形数组长度:"); scanf("%d", &length); /* 动态分配 */ int *array = (int *)malloc(length * sizeof(int)); if(array == NULL){ fprintf(stderr, "内存不足\n"); exit(EXIT_FAILURE); } // 对于实际开发来说,此处可以加入更多逻辑处理... /* 清理工作 */ free(array); } ``` 上述代码片段展示了基本流程:先询问用户期望构建多大规模的数据结构;接着通过乘法运算计算出总需占用多少个四字节单位(假设目标平台上的`int`占四个字节),并将结果传递给`malloc()`完成相应规模区块的确立;最后记得适时回收不再使用的部分以免造成泄漏问题。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值