C语言之动态内存开辟之malloc
说到动态内存开辟,就不得不谈malloc、calloc、realloc以及free,所以接下来分别谈一下这四个函数。
1、malloc(开辟动态内存空间)
头文件:#include<stdlib.h> 定义:void* malloc ( size_t num )
其函数参数仅仅只要写多少个字节,所以鬼知道其类型是什么,所以其返回值也只能为void*类型。
- malloc开辟内存空间就一定能开辟成功吗?
答案显然不可能,毕竟计算机最大内存都限制了,所以不是想开辟多大就能开辟多大,也就是说不能所有情况都能开辟成功!那怎么才能知道没开辟成功呢?
没开辟成功一定会有错误信息显示,所以可以调用perror函数,它可以直接将错误信息打印出来,当然也可以使用strerror,不过其参数应为errno(c语言库函数出错信息)。
#include<stdio.h>
#include<limits.h>
#include<stdlib.h>
#include<string.h>
int main()
{int i;//开辟10个int类型大小的字节int* ch = (int*)malloc(40);//判断是否开辟成功if (ch == NULL){perror("");printf("%s", strerror(errno));}//进行赋值for (i = 0; i < 10; i++)*(ch + i) = i;//进行打印for (i = 0; i < 10; i++)printf("%d ", *(ch + i));free(ch);ch = NULL;return 0;
}
此时是动态开辟成功时的样子,此时在这提醒:
- 使用动态内存开辟时,一定先去判断是否开辟再使用!
- 局部变量、形式参数都是在栈区开辟,进入代码段创建出代码段自动销毁;但是动态内存开辟是在堆区开辟的,其不会自动销毁(只有程序不结束),所以再使用完动态内存空间后,需要使用free释放掉动态内存空间,同时释放时,一定要将开辟动态内存空间的起始地址作为参数使用free销毁!
- free能不能不销毁起始位置,别搞事,编译器会给你搞报错的!同时销毁后一定要将起始位置置为NULL指针!
接下来看看开辟失败的样子!
# define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<limits.h>
#include<stdlib.h>
#include<string.h>
int main()
{int i;//开辟10个int类型大小的字节int* ch = (int*)malloc(INT_MAX);//判断是否开辟成功if (ch == NULL){perror("1");printf("2: %s", strerror(errno));}//进行赋值for (i = 0; i < 10; i++)*(ch + i) = i;//进行打印for (i = 0; i < 10; i++)printf("%d ", *(ch + i));free(ch);ch = NULL;return 0;
}
此处直接整个INT_MAX(21亿多),所以使用perror和strerror都显示没开辟空间成功的原因是没有足够的空间;提一句,perror会直接打印,而strerror只是存储错误信息。
C语言之动态内存开辟之malloc相关推荐
- 【C语言】动态内存开辟
目录 一.动态内存开辟的原因 二.动态内存开辟函数 1.malloc函数 2.free函数 3.calloc 4.realloc 总结 三.C/C++内存开辟 四.柔性数组 1.柔性数组定义 2.柔性 ...
- 【C语言】动态内存开辟的使用『malloc』
- C语言之动态内存管理与动态内存函数
文章目录 一.为什么存在动态内存分配? 二.动态内存函数的介绍 1.malloc和free 2.calloc函数 3.realloc函数 一.为什么存在动态内存分配? 学习动态内存的管理方法之前,我们 ...
- C语言动态内存开辟详解(malloc,calloc,realloc,free,柔型数组)
目录 一.概述 二.相关库函数的使用 1.malloc 2.calloc malloc vs. calloc 异同 3.free的使用 4.realloc 三.易错点 四.C\C++程序的内存开辟规则 ...
- C语言实现通讯录【二】(动态内存开辟,文件数据存储)
C语言实现通讯录[二] 在C语言实现通讯录[一]的基础上进行优化,主要实现两大模块: 动态内存开辟 文件数据存储 动态内存开辟: 考虑到通讯录的大小无法固定,在C语言实现通讯录[一]版本上定义一个足够 ...
- 简陋版C语言仿真通讯录之动态内存开辟版本
简陋版C语言仿真通讯录 https://blog.csdn.net/csdn_kou/article/details/80287640 简陋版C语言仿真通讯录之动态内存开辟版本 给Contact结构体 ...
- c语言malloc引用类型作参数,c语言中动态内存分配malloc只在堆中分配一片内存.doc...
c语言中动态内存分配malloc只在堆中分配一片内存 .C语言中动态内存分配(malloc)只在堆中分配一片内存,返回一个void指针(分配失败则返回0),并没有创建一个对象.使用时需要强制转换成恰当 ...
- 动态内存管理:malloc和free以及new和delete的联系与区别
动态内存管理:malloc和free以及new和delete的联系与区别 文章目录 动态内存管理:malloc和free以及new和delete的联系与区别 一. C/C++中程序内存区域划分: 二. ...
- C语言中动态内存分配的本质是什么?
摘要:C语言中比较重要的就是指针,它可以用来链表操作,谈到链表,很多时候为此分配内存采用动态分配而不是静态分配. 本文分享自华为云社区<[云驻共创]C语言中动态内存分配的本质>,作者: G ...
最新文章
- seq2seq模型_Bart: Seq2Seq预训练模型
- 地方门户网站运营策略
- JAVA运算符\操作符
- 台式机共享笔记本的无线网络(只需要一根网线)
- yum install nginx
- 工作170:删除做个判断操作 成功删除 取消取消
- 开源社区慌不慌?又一个 Linux 发行版宣告死亡
- epson me 1+只有主机能打印不能共享网络打印问题的处理
- spring boot 注解
- powershell自动化操作AD域、Exchange邮箱系列(5)——AD模块加载与命令一览
- pandas获取某行数据
- matlab拟合公式不准确,Matlab拟合函数误差:函数值和YDATA大小不相等
- dd命令创建一个大文件
- 网站搭建需要什么技术?
- Docker从入门到放弃------docker的安装与初始化配置
- AT2401C完美替代RFX2401C性价比更高
- 成都市住房公积金提取指南办理手续流程
- 基于SSM实现的艺术品鉴定管理系统+App
- C语言和JAVA的关联
- Linux 音频驱动(一) ASoC音频框架简介