说到动态内存开辟,就不得不谈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相关推荐

  1. 【C语言】动态内存开辟

    目录 一.动态内存开辟的原因 二.动态内存开辟函数 1.malloc函数 2.free函数 3.calloc 4.realloc 总结 三.C/C++内存开辟 四.柔性数组 1.柔性数组定义 2.柔性 ...

  2. 【C语言】动态内存开辟的使用『malloc』

  3. C语言之动态内存管理与动态内存函数

    文章目录 一.为什么存在动态内存分配? 二.动态内存函数的介绍 1.malloc和free 2.calloc函数 3.realloc函数 一.为什么存在动态内存分配? 学习动态内存的管理方法之前,我们 ...

  4. C语言动态内存开辟详解(malloc,calloc,realloc,free,柔型数组)

    目录 一.概述 二.相关库函数的使用 1.malloc 2.calloc malloc vs. calloc 异同 3.free的使用 4.realloc 三.易错点 四.C\C++程序的内存开辟规则 ...

  5. C语言实现通讯录【二】(动态内存开辟,文件数据存储)

    C语言实现通讯录[二] 在C语言实现通讯录[一]的基础上进行优化,主要实现两大模块: 动态内存开辟 文件数据存储 动态内存开辟: 考虑到通讯录的大小无法固定,在C语言实现通讯录[一]版本上定义一个足够 ...

  6. 简陋版C语言仿真通讯录之动态内存开辟版本

    简陋版C语言仿真通讯录 https://blog.csdn.net/csdn_kou/article/details/80287640 简陋版C语言仿真通讯录之动态内存开辟版本 给Contact结构体 ...

  7. c语言malloc引用类型作参数,c语言中动态内存分配malloc只在堆中分配一片内存.doc...

    c语言中动态内存分配malloc只在堆中分配一片内存 .C语言中动态内存分配(malloc)只在堆中分配一片内存,返回一个void指针(分配失败则返回0),并没有创建一个对象.使用时需要强制转换成恰当 ...

  8. 动态内存管理:malloc和free以及new和delete的联系与区别

    动态内存管理:malloc和free以及new和delete的联系与区别 文章目录 动态内存管理:malloc和free以及new和delete的联系与区别 一. C/C++中程序内存区域划分: 二. ...

  9. C语言中动态内存分配的本质是什么?

    摘要:C语言中比较重要的就是指针,它可以用来链表操作,谈到链表,很多时候为此分配内存采用动态分配而不是静态分配. 本文分享自华为云社区<[云驻共创]C语言中动态内存分配的本质>,作者: G ...

最新文章

  1. seq2seq模型_Bart: Seq2Seq预训练模型
  2. 地方门户网站运营策略
  3. JAVA运算符\操作符
  4. 台式机共享笔记本的无线网络(只需要一根网线)
  5. yum install nginx
  6. 工作170:删除做个判断操作 成功删除 取消取消
  7. 开源社区慌不慌?又一个 Linux 发行版宣告死亡
  8. epson me 1+只有主机能打印不能共享网络打印问题的处理
  9. spring boot 注解
  10. powershell自动化操作AD域、Exchange邮箱系列(5)——AD模块加载与命令一览
  11. pandas获取某行数据
  12. matlab拟合公式不准确,Matlab拟合函数误差:函数值和YDATA大小不相等
  13. dd命令创建一个大文件
  14. 网站搭建需要什么技术?
  15. Docker从入门到放弃------docker的安装与初始化配置
  16. AT2401C完美替代RFX2401C性价比更高
  17. 成都市住房公积金提取指南办理手续流程
  18. 基于SSM实现的艺术品鉴定管理系统+App
  19. C语言和JAVA的关联
  20. Linux 音频驱动(一) ASoC音频框架简介

热门文章

  1. 插入法排序(c语言)
  2. 03.spring framework的AOP
  3. Docker - 启动tomcat成功但无法打开8080
  4. Zookeeper学习笔记2-------group创建、查询、删除
  5. 2015年华为实习生机试样题(记票统计,计算麻将的番数,Word Maze(单词迷宫))
  6. Arduino ESP32 通过定时器(Timer)功能唤醒深度睡眠
  7. 零基础最详细html和css
  8. Spring Cloud 基本理论概述
  9. UE4快速实现涂鸦功能
  10. 什么是云数据库?这篇文章详细告诉你!