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>
#include<malloc.h>
int main()
{
  char *p;

  p=(char *)malloc(100);
  if(p)
    printf("Memory Allocated at: %x/n",p);
  else
    printf("Not Enough Memory!/n");
  free(p);
  return 0;
}

二、函数声明(函数原型):

  void *malloc(int size);

  说明:malloc 向系统申请分配指定size个字节的内存空间。返回类型是 void* 类型。void* 表示未确定类型的指针。C,C++规定,void* 类型可以强制转换为任何其它类型的指针。这个在MSDN上可以找到相关的解释,具体内容如下:

malloc returns a void pointer to the allocated space, or NULL if there is insufficient memory available. To return a pointer to a type other than void, use a type cast on the return value. The storage space pointed to by the return value is guaranteed to be suitably aligned for storage of any type of object. If size is 0, malloc allocates a zero-length item in the heap and returns a valid pointer to that item. Always check the return from malloc, even if the amount of memory requested is small.

三、malloc与new的不同点

  从函数声明上可以看出。malloc 和 new 至少有两个不同: new 返回指定类型的指针,并且可以自动计算所需要大小。比如:

  int *p;

  p = new int; //返回类型为int* 类型(整数型指针),分配大小为 sizeof(int);

  或:

  int* parr;

  parr = new int [100]; //返回类型为 int* 类型(整数型指针),分配大小为 sizeof(int) * 100;

 

    而 malloc 则必须由我们计算要字节数,并且在返回后强行转换为实际类型的指针。

   int* p;

  p = (int *) malloc (sizeof(int));

  第1、malloc 函数返回的是 void * 类型,如果你写成:p = malloc (sizeof(int)); 则程序无法通过编译,报错:“不能将 void* 赋值给 int * 类型变量”。所以必须通过 (int *) 来将强制转换。

  第2、函数的实参为 sizeof(int) ,用于指明一个整型数据需要的大小。如果你写成:

  int* p = (int *) malloc (1);

  代码也能通过编译,但事实上只分配了1个字节大小的内存空间,当你往里头存入一个整数,就会有3个字节无家可归,而直接“住进邻居家”!造成的结果是后面的内存中原有数据内容全部被清空。

  malloc 也可以达到 new [] 的效果,申请出一段连续的内存,方法无非是指定你所需要内存大小。

  比如想分配100个int类型的空间:

  int* p = (int *) malloc ( sizeof(int) * 100 ); //分配可以放得下100个整数的内存空间。

  另外有一点不能直接看出的区别是,malloc 只管分配内存,并不能对所得的内存进行初始化,所以得到的一片新内存中,其值将是随机的。

  除了分配及最后释放的方法不一样以外,通过malloc或new得到指针,在其它操作上保持一致。

四、动态申请数组

申请一维数组
一维数组的数组名可以看成数组起始元素的首地址,因此我定义一个int *arr的指针,分配n个大小的int型空间,写法如下:

#include <stdio.h>
  #include <stdlib.h> 

  int main(void)
  {
    int n, *arr; 

    while (scanf("%d", &n) != EOF) {
      arr = (int *)malloc(sizeof(int) * n);
    } 

    return 0;
  }

申请二维数组
二维数组的数组名是其所有一维数组的首地址,因为二维数组的数组名是指针的指针,因为我定义一个row行column列的二维数组,写法如下:

  #include <stdio.h>
  #include <stdlib.h> 

  int main(void)
  {
    int i, row, column, **arr; 

    while (scanf("%d %d", &row, &column) != EOF) {
      arr = (int **)malloc(sizeof(int *) * row); // 分配所有行的首地址
      for (i = 0; i < row; i ++) { // 按行分配每一列
        arr[i] = (int *)malloc(sizeof(int) * column);
      } 

      free(arr);
    } 

    return 0;
  }


总结:

malloc()函数其实就在内存中找一片指定大小的空间,然后将这个空间的首地址范围给一个指针变量,这里的指针变量可以是一个单独的指针,也可以是一个数组的首地址,这要看malloc()函数中参数size的具体内容。我们这里malloc分配的内存空间在逻辑上连续的,而在物理上可以连续也可以不连续。对于我们程序员来说,我们关注的是逻辑上的连续,因为操作系统会帮我们安排内存分配,所以我们使用起来就可以当做是连续的。

(0)

相关推荐

  • 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 )); 释

  • 基于malloc与free函数的实现代码及分析

    用于内存管理的malloc与free这对函数,对于使用C语言的程序员应该很熟悉.前段时间听说有的IT公司以"实现一个简单功能的malloc"作为面试题,正好最近在复习K&R,上面有所介绍,因此花了些时间仔细研究了一下.毕竟把题目做出来是次要的,了解实现思想.提升技术才是主要的.本文主要是对malloc与free实现思路的介绍,蓝色部分文字是在个人思考中觉得比较核心的东西:另外对于代码的说明,有一些K&R上的解释,使用绿色加亮. 在研究K&R第八章第五节的实现之前

  • new和malloc的区别深入解析

    1. malloc()函数1.1 malloc的全称是memory allocation,中文叫动态内存分配.原型:extern void *malloc(unsigned int num_bytes); 说明:分配长度为num_bytes字节的内存块.如果分配成功则返回指向被分配内存的指针,分配失败返回空指针NULL.当内存不再使用时,应使用free()函数将内存块释放. 1.2 void *malloc(int size); 说明:malloc 向系统申请分配指定size个字节的内存空间,返

  • C++中new与delete、malloc与free应用分析

    一般来说,在C/C++的面试时,对于new/delete和malloc/free这两对的使用和区别经常被考查到,如果这种基础的问题都答不上来,估计很难过面试了.本文即是对new/delete和malloc/free这两对的使用和区别较为简单的分析一下,供大家参考. 一.new和delete new和delete是C++的运算符,用于动态分配内存和释放内存. 1.new表达式 标准库定义了operator new函数的几个重载版本,没有使用noexcept说明的版本在内存分配失败时可能会抛出bad

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

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

  • c语言中malloc、realloc与calloc 的区别以及联系

    ANSI C说明了三个用于存储空间动态分配的函数(1) malloc分配指定字节数的存储区.此存储区中的初始值不确定 (2) calloc为指定长度的对象,分配能容纳其指定个数的存储空间.该空间中的每一位(bit)都初始化为0 (3) realloc  更改以前分配区的长度(增加或减少).当增加长度时,可能需将以前分配区的内容移到另一个足够大的区域,而新增区域内的初始值则不确定 .分配函数时再分配 realloc()使我们可以增.减以前分配区的长度(最常见的用法是增加该区). 如果先分配一个可容

  • 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 语言中strstr函数实例详解

    C 语言中strstr函数实例详解 strstr函数 strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串.如果是,则该函数返回str2在str1中首次出现的地址:否则,返回NULL const char* strstr(const char* str1,const char* str2); char* strstr(char* str1,const char* str2); 库中实现的strstr #include <stdio.h> #include <

  • Go语言中sync.Cond使用详解

    目录 sync.Cond 可以用来干什么? 与 Sync.Mutex 的区别 sync.Cond 使用场景 sync.Cond sync.Cond 有哪些方法 NewCond 创建实例 Broadcast 广播唤醒所有 Signal 唤醒一个协程 Wait 等待 代码示例 sync.Cond 可以用来干什么? Golang 的 sync 包中的 Cond 实现了一种条件变量,可以使用多个 Reader 等待公共资源. 每个 Cond 都会关联一个 Lock ,当修改条件或者调用 Wait 方法,

  • C语言中的getchar()使用详解

    目录 前言 getchar困惑的点 缓冲区 缓冲区带来的问题 getchar工作原理 解决缓冲区带来的问题之清空缓存区 解决最初的困惑 总结 前言 近期我在重新学习C语言时候,我发现了一个严重的问题,getchar我居然不会用了....也不是说不会用,我发现了一个非常让我困惑想不明白的问题.可能我在第一次接触C语言时候,就没有把这个概念弄清楚吧,以至于现在会不明白. getchar困惑的点 我利用getchar函数输入了一串字符ABCD,然后把这串字符给到ch,然后紧接着我打印这个ch,然后我得

  • go语言中GoMock安装使用详解

    目录 安装 开始 使用参数匹配器 经验之谈 安装 GoMock是一个Go框架.它与内置的测试包整合得很好,并在单元测试时提供了灵活性.正如我们所知,对具有外部资源(数据库.网络和文件)或依赖关系的代码进行单元测试总是很麻烦. 为了使用GoMock,我们需要安装gomock包github.com/golang/mock/gomock和mockgen代码生成工具github.com/golang/mock/mockgen.使用这个命令行: go get github.com/golang/mock/

  • go语言中decimal的用法详解

    目录 1. 精度丢失的case 2. decimal的应用场景 3. 使用decimal 4. decimal其他实用的场景 4.1 获取结果的整数部分 4.2 小数点后填充 4.3 比较数字的大小 5 小结 decimal是为了解决Golang中浮点数计算时精度丢失问题而生的一个库,使用decimal库我们可以避免在go中使用浮点数出现精度丢失的问题. github地址:https://github.com/shopspring/decimal 1. 精度丢失的case func TestFl

  • C语言中continue的用法详解

    目录 前言 continue 在while中的用法 continue 在for中的用法 continue 在剔除多余元素的用法 附:continue与break的区别 总结 前言 continue语句的作用是跳过本次循环体中余下尚未执行的语句,立即进行下一次的循环条件判定,可以理解为仅结束本次循环. 注意:continue语句并没有使整个循环终止. continue 在while中的用法 //continue 在while中的用法 #include<stdio.h> int main() {

  • 关于C语言中E-R图的详解

    E-R  英文缩写为(Entity Relationship Diagram)也称实体-联系图. 提供了表示实体类型.属性和联系的方法,用来描述现实世界的概念模型. 下面就讲详解e-r图,如下: 从上面的的图可以看到一个完整的e-r图有四个部分: 1.矩形框,矩形表示实体型,矩形框内写明实体名: 2.椭圆框,椭圆表示实体的属性,并用无向边将其与相应的实体型连接起来: 3.菱形框,菱形表示实体型之间的联系,在菱形框内写明联系名, 4.联系线,实体与属性之间:实体与联系之间:联系与属性之间用直线相连

  • R语言中devtools的使用详解

    今天安装r语言devtools包,尝试很多种方法也不能决解,下面这个问题是改变镜像,然后就会可以安装了(3.4.2版本) Warning in install.packages : InternetOpenUrl failed: '无法解析服务器的名称或地址' Warning in install.packages : InternetOpenUrl failed: '不能连接到吊销服务器,或者未能获得最终响应.' Warning in install.packages : InternetOp

  • C语言malloc分配问题详解

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

随机推荐