C语言malloc分配问题详解

目录
  • 前言
  • 一、malloc是什么?
    • 1.1malloc定义
    • 1.2malloc函数含义
  • 二、malloc的使用
    • 2.1添加头文件
    • 2.2malloc和free
    • 2.3malloc使用注意
  • 三、malloc内存分配失败
    • 3.1指针越界
    • 3.2为指针分配的内存太小
    • 3.3内存分配成功,但并未初始化
    • 3.4内存越界
  • 四、参考文章
  • 总结

前言

空间分配要点有:一是空间分配的连续性;二是动态内存申请;三是防止程序执行中出现异常错误。

提示:开始讲解了嗷~后续会根据精力持续更新嗷!!记得关注收藏点赞嘿嘿!蟹蟹

一、malloc是什么?

1.1malloc定义

void *malloc(size_t a)

1.a为内存块的大小,以字节为单位

2.该函数返回一个指针 ,指向已分配大小的内存。如果请求失败,则返回 NULL。

3.当内存不再使用的时候,应使用free()函数将内存块释放掉。

4.void *,表示未确定类型的指针。C,C++规定,void *类型可以强转为任何其他类型的的指针。( 其他任意类型变量都可以直接赋值给它,无需进行强转,但是反过来不可以。)

1.2malloc函数含义

malloc 函数其实就是在内存中:找一片指定大小的空间,然后将这个空间的首地址给一个指针变量,这里的指针变量可以是一个单独的指针,也可以是一个数组的首地址, 这要看malloc函数中参数size的具体内容。我们这里malloc分配的内存空间在逻辑上是连续的,而在物理上可以不连续。

例如,对传入的一个图像进行解释、识别,那么首先要做的,是将此文件数据装入内存中(malloc),执行完成后,立即释放(free)。这就需要malloc及free了。

对于超过1000字节的数组空间,建议用malloc/free,以确保数组变量的绝对正确;小的空间,直接用数组定义即可。

二、malloc的使用

2.1添加头文件

##1.添加头文件使用malloc函数一般要添加头文件:#include <malloc.h>或者#include <alloc.h>;

你也可以选择自己定义实现malloc函数也可以。详细可以看下列参考文章【1】malloc 函数详解

2.2malloc和free

一旦你使用了malloc,就一定要对它进行free。

如果申请后不释放就是内存泄露;

如果无故释放那就是什么都没有做;

释放只能释放一次,如果释放两次及两次以上会出现错误(但是释放空指针例外,释放空指针其实也等于什么都没有做,所以,释放多少次都是可以的)。

2.3malloc使用注意

int *a =NULL;
a = (int *)malloc(8);

这种malloc方式,只是意思是分配8字节的空间,但是这种在访问数组a[8] = 2时候会产生指针越界,因为它其实访问的是a+8*sizeof(int)。

所以下列malloc方式更好:

int *a =NULL;
a = (int *)malloc(8*sizeof(int));

三、malloc内存分配失败

3.1指针越界

定义了指针变量,但是没有为指针分配内存,即指针没有指向一块合法的内存。

1.结构体成员指针未初始化

2.没有为结构体指针分配足够的内存

3.函数的入口处做指针校验

3.2为指针分配的内存太小

为指针分配了内存,但是内存大小不够,导致出现越界错误。

3.3内存分配成功,但并未初始化

犯这个错误往往是由于没有初始化的概念或者是以为内存分配好之后其值自然为0。定义一个变量时,第一件事就是初始化。你可以把它初始化为一个有效的值。

3.4内存越界

内存分配成功,且已经初始化,但是操作越过了内存的边界。可能使用了memset、memcpy等函数进行了越界访问,也有可能是以指针或数组的形式进行了越界访问,导致malloc函数返回0。

这种错误经常是由于操作数组或指针时出现“多1”或“少1”。所以,for循环的循环变量一定要使用半开半闭的区间,而且如果不是特殊情况,循环变量尽量从0开始。

四、参考文章

【1】malloc 函数详解

【2】c语言中malloc申请的空间和直接定义变量申请的空间有什么区别?

【3】malloc内存分配失败

【3】malloc函数申请内存失败

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • c语言 malloc函数详解

    谈到malloc函数相信学过c语言的人都很熟悉,但是malloc底层到底做了什么又有多少人知道. 1.关于malloc相关的几个函数 关于malloc我们进入Linux man一下就会得到如下结果: 也可以这样认为(window下)原型: extern void *malloc(unsigned int num_bytes); 头文件: #include<malloc.h>或者#include<alloc.h>两者的内容是完全一样的 如果分配成功:则返回指向被分配内存空间的指针 不

  • C语言内存的动态分配比较malloc和realloc的区别

    C-动态内存分配之malloc与realloc的区别 在程序的执行期间分配内存时,内存区域中的这个空间称为堆(heap).还有另一个内存区域,称为栈(stack),其中的空间分配给函数的参数和本地变量.在执行完该函数后,存储参数和本地变量的内存空间就会释放.堆中的内存是由程序员控制的.在分配堆上的内存时,由程序员跟踪所分配的内存何时不再需要,并释放这些空间,以便于以后重用它们.      使用动态内存很明显的好处就是:不需要预先分配存储空间且分配的空间可以根据程序的需要扩大或缩小,这样可以有效的

  • C语言中 malloc,calloc,realloc的区别

    C语言中 malloc.calloc.realloc的区别 (1)C语言跟内存分配方式 <1>从静态存储区域分配. 内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量.static变量. <2>在栈上创建 在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放.栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限. <3>从堆上分配,亦称动态内存分配. 程序在运行的时候用malloc

  • C语言中的malloc使用详解

    一.原型:extern void *malloc(unsigned int num_bytes); 头文件:#include <malloc.h> 或 #include <alloc.h> (注意:alloc.h 与 malloc.h 的内容是完全一致的.) 功能:分配长度为num_bytes字节的内存块 说明:如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL. 当内存不再使用时,应使用free()函数将内存块释放. 举例: #include<stdio.h&g

  • C语言中多维数组的内存分配和释放(malloc与free)的方法

    如果要给二维数组(m*n)分配空间,代码可以写成下面: 复制代码 代码如下: char **a, i; // 先分配m个指针单元,注意是指针单元 // 所以每个单元的大小是sizeof(char *) a = (char **) malloc(m * sizeof(char * )); // 再分配n个字符单元, // 上面的m个指针单元指向这n个字符单元首地址 for(i = 0; i < m; i++) a[i] = (char * )malloc(n * sizeof(char )); 释

  • C语言malloc分配问题详解

    目录 前言 一.malloc是什么? 1.1malloc定义 1.2malloc函数含义 二.malloc的使用 2.1添加头文件 2.2malloc和free 2.3malloc使用注意 三.malloc内存分配失败 3.1指针越界 3.2为指针分配的内存太小 3.3内存分配成功,但并未初始化 3.4内存越界 四.参考文章 总结 前言 空间分配要点有:一是空间分配的连续性:二是动态内存申请:三是防止程序执行中出现异常错误. 提示:开始讲解了嗷~后续会根据精力持续更新嗷!!记得关注收藏点赞嘿嘿!

  • C语言之平衡二叉树详解

    目录 什么是平衡二叉树 平衡二叉树的基本特点 为什么会出现平衡二叉树 二叉树四种不平衡的情况 C语言实现平衡二叉树 什么是平衡二叉树 平衡二叉树是具有平衡属性的有序二叉树,所谓的平衡即当前树的左右子树高度差的绝对值不超过1.因为平衡二叉树是由苏联数学家Adelson-Velskii和Landis提出,所以又称为AVL树. 平衡二叉树的基本特点 是特殊的有序二叉树 左右子树高度差的绝对值不超过1 左右子树仍然是平衡二叉树 为什么会出现平衡二叉树 在学习平衡二叉树之前必定已经学过有序二叉树,有序二叉

  • 易语言子程序知识点详解

    将程序分割成较小的逻辑组件就可以简化程序设计任务,这些逻辑组件被称为子程序. 子程序可用于压缩重复任务或共享任务,例如,压缩频繁的计算处理等等. 用子程序编程有两大好处: 子程序可使程序划分成离散的逻辑组件,每个组件都比无子程序的整个程序容易调试及理解: 一个应用程序中的子程序,往往不必修改或只需稍作改动,便可以成为另一个程序的子程序. 每次调用子程序时,子程序中的所有语句都将被从第一条开始顺序执行,当执行到子程序尾部或者遇到"返回"命令时即返回到调用此子程序语句的下一条语句处. 子程

  • Spring表达式语言SpEL用法详解

    这篇文章主要介绍了spring表达式语言SpEL用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 (1)spring表达式语言是一个支持运行时查询和操作对象图得我强大表达式语言. (2)语言类似于EL:SpEL使用#{...}作为定界符.所有在大括号中的字符串均被认为是SpEL. (3)SpEL为bean的属性进行动态赋值提供了便利. (4)通过SpEL可以实现: 通过Bean的id对Bean进行引用 调用方法及引用对象的属性 计算表达式

  • R语言数据类型深入详解

    R语言用来存储数据的对象包括: 向量, 因子, 数组, 矩阵, 数据框, 时间序列(ts)以及列表 意义介绍 1. 向量(一维数据): 只能存放同一类型的数据 语法: c(data1, data2, ...),访问的时候下标从1开始(和Matlab相同);向量里面只能存放相同类型的数据. > x <- c(1,5,8,9,1,2,5) > x [1] 1 5 8 9 1 2 5 > y <- c(1,"zhao") # 这里面有integer和字符串, 整

  • R语言关联规则深入详解

    在用R语言做关联规则分析之前,我们先了解下关联规则的相关定义和解释. 关联规则的用途是从数据背后发现事物之间可能存在的关联或者联系,是无监督的机器学习方法,用于知识发现,而非预测. 关联规则挖掘过程主要包含两个阶段:第一阶段从资料集合中找出所有的高频项目组,第二阶段再由这些高频项目组中产生关联规则. 接下来,我们了解下关联规则的两个主要参数:支持度和置信度. 用简化的方式来理解这两个指标,支持度是两个关联物品同时出现的概率,而置信度是当一物品出现,则另一个物品也出现的概率. 假如有一条规则:牛肉

  • R语言“循环”知识点详解

    可能有一种情况,当你需要执行一段代码几次. 通常,顺序执行语句. 首先执行函数中的第一个语句,然后执行第二个语句,依此类推. 编程语言提供允许更复杂的执行路径的各种控制结构. 循环语句允许我们多次执行一个语句或一组语句,以下是大多数编程语言中循环语句的一般形式 - R编程语言提供以下种类的循环来处理循环需求. 单击以下链接以检查其详细信息. Sr.No. 循环类型和描述 1 repeat循环 多次执行一系列语句,并简化管理循环变量的代码. 2 while循环 在给定条件为真时,重复语句或语句组.

  • C语言字符串数组详解

    C语言字符串数组 字符串是连续的字符序列,最后以空字符'\0'作为终止符.一个字符串的长度指所有字符的数量,但不包括终止符.在 C 语言中,没有字符串类型,自然也就没有运算符以字符串为操作数. 字符串被存储在元素类型为 char 或宽字符类型数组中(宽字符类型指 wchar_t.char16_t 或 char32_t).宽字符组成的字符串也称为宽字符串(wide string). C 标准库提供了大量的函数,它们可以对字符串进行基本操作,例如字符串的比较.复制和连接等.在这些传统的字符串函数以外

  • C语言lseek()函数详解

     头文件: #include <sys/types.h> #include <unistd.h> 函数原型: off_t lseek(int fd, off_t offset, int whence);//打开一个文件的下一次读写的开始位置 参数: fd 表示要操作的文件描述符 offset是相对于whence(基准)的偏移量 whence 可以是SEEK_SET(文件指针开始),SEEK_CUR(文件指针当前位置) ,SEEK_END为文件指针尾 返回值: 文件读写指针距文件开头

随机推荐