直接上代码分析

#include <stdio.h>
#include <string.h>
#include <malloc.h>int mian() {int a[5] = { 1,5,8,46,12 };int len;printf("请输入你要分配数组的长度: len=");scanf("%d", &len);int * pArr = (int *)malloc(sizeof(int) * len);   //为什么这里要使用强制类型转化?//malloc函数返回的是第一个元素地址,//这个第一个元素地址是没有意义的,因为double  int  char类型都一样返回第一个元素地址,//程序无法知道这个第一个元素地址是什么类型的和占几个字节,//所以需要强制类型转换告诉程序malloc函数返回的第一个元素地址的什么类型的*pArr = 4;    //类似于 a[0] = 4;pArr[1] = 10;    //类似于  a[1] = 10;}

int* pArr = (int*)malloc(sizeof(int)*len);         如果len占5个字节的话,那么 malloc(sizeof(int)*len)=20  个字节, 20表示的是这个malloc函数请求操作系统要为我们的程序分配20个字节的空间,就是提供20个字节的空间来为我们程序进行读写.

malloc函数只能返回第一个字节的地址,这个是系统规定的,第一个字节的地址没有实际含义。因为不能根据第一个字节地址来确定这个变量占了几个字节。因为整形变量占四个字节,它也是以第一个字节地址来表示的,如果这个变量是double类型的话,它也是以第一个字节地址来表示的。无论这个变量占几个字节它都是以第一个字节来表示的,所以malloc返回的第一个字节地址是没有实际意义的地址(干地址)。所以我们需要在  malloc(sizeof(int)*len)  的前面加一个强制类型转换  (int*)malloc(sizeof(int)*len)  来告诉我们的编译器,我们返回的第一个字节地址到底是整型的地址,还是其他类型的地址。所以强制转换成 int * 的话,那么我们的  pArr+1  的话那么它将会指向后面的一个 int * 的位数,会指向后四位,如果强制类型是  double *  的话,  pArr + 1   将会指向后八位的地址。

所以我们的  pArr  就等价与   a(数组,数组名表示首地址) , 因为a是指向了第一个元素,第一个元素就占了四个字节。   malloc(sizeof(int)*len)  这个分配了20个字节,malloc返回第一个整型的地址,pArr也指向前四个字节,pArr表示的是整型的地址。  那么  pArr + 1  就是指向了后四位了。

那么  *pArr = 4;     //类似于   a[0] = 4;

pArr[1] = 10;   //类似于a[1] = 10;

然后就导致了   pArr  表示前四位(第一个字节)

pArr + 1  就指向了后四位(一字节)

void main(){int a[5] = {4,10,2,8,6};int len;printf("请输入你需要分配的数组的长度:len=");scanf("%d",&len);int * pArr = (int *)malloc(sizeof(int)*len);    //malloc 是系统函数//*pArr = 4;    //类似于 a[0] = 4;//pArr[1] = 10;    //类似于  a[1] = 10;//printf("%d %d\n", *pArr,pArr[1]);//我们可以把pArr当作一个普通数组来使用for(int i=0;i<len;++i)scanf("%d",&pArr[i]);for(i=0;i<len;++i)printf("%d\n"*(pArr+i));free(pArr);    //把pArr所代表的动态分配的20个字节内存释放return 0;

free(pArr);    //把pArr所代表的动态分配的20个字节内存释放

数据结构之malloc()函数动态内存分配复习相关推荐

  1. C中的malloc:C中的动态内存分配

    什么是C中的malloc()? (What is malloc() in C?) malloc() is a library function that allows C to allocate me ...

  2. C/C++——动态内存分配

    动态内存分配,就是指在程序执行的过程中动态地分配或者回收存储空间的分配内存的方法.动态内存分配不像数组等静态内存分配方法那样需要预先分配存储空间,而是由系统根据程序的需要即时分配,且分配的大小就是程序 ...

  3. 动态内存分配(malloc函数)

    动态内存分配 原型 extern void*malloc(unsigned int num_bytes); 头文件 #include<stdlib.h> 功能 分配长度为num_bytes ...

  4. C语言学习笔记10-指针(动态内存分配malloc/calloc、realloc、释放free,可变数组实现;Tips:返回指针的函数使用本地变量有风险!;最后:函数指针)

    C语言:指针 1. 指针:保存地址的变量 *p (pointer) ,这种变量的值是内存的地址.   取地址符& 只用于获取变量(有地址的东西)的地址:scanf函数-取地址符   地址的大小 ...

  5. C语言动态内存管理和动态内存分配函数

    给变量分配内存空间可分为静态内存分配和动态内存分配. 静态内存分配属于编译时给变量分配的空间,动态分配属于在程序运行时给变量分配的空间 静态分配属于栈分配,动态分配属于堆分配 运行效率上,静态内存比动 ...

  6. linux c free大段内存,Linux C 动态内存分配--malloc,new,free及相关内容

    一.malloc()和free()的基本概念以及基本用法: 1.函数原型及说明: void *malloc(long NumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针 ...

  7. malloc动态内存分配

    运用动态内存分配可以有效解决定义的数组或者结构体大小不够用的情况,动态内存分配就是人为的向系统申请一个指定大小的空间用来存放临时数据.在c语言中,一些可控或者说是一些小数据下,可以人为定义一些变量用来 ...

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

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

  9. 【C进阶】之动态内存分配及内存操作函数

    动态内存分配及内存操作函数 1 动态内存分配的介绍 2 malloc和free函数 3 测试代码 4 goto的使用场合,常用于出错处理 5 memset() 6 memcpy() 7 memcmp( ...

最新文章

  1. 一款遥控器拆解之后可利用的元器件
  2. Windows Phone 7 MVVM模式通讯方式之实现Command
  3. java前言之计算机常识
  4. 如何让hybris启动加快
  5. Java中关键字及其简要含义
  6. Dapr + .NET 实战(十三)跨语言开发
  7. MATLAB静力学分析,锻造操作机静力学的Matlab仿真分析
  8. 《逆袭进大厂》之C++篇49问49答(绝对的干货)
  9. 【操作系统】Nachos 多道程序设计
  10. idc机房运维巡检_20年代IDC的“新十二大”基础设施系统你都了解吗?
  11. 华三交换机配置vrrp_h3c vrrp配置实例
  12. 利用python批量修改word文档页眉
  13. ubuntu使用cmake编译coffe
  14. 如何调试delphi的Access violation at address错误
  15. 职称计算机ppt2007易错题,职称计算机考试xcel2007模块难题通关技巧.doc
  16. html盒子页面居中,网页布局盒子(box)相关属性和盒子居中
  17. 网易互联网,网易互娱 2021届校招内推开始啦
  18. L. Lifeguards(排序)
  19. wx小程序(wxml)
  20. VS code 显示中文异常解决办法

热门文章

  1. 计算机设计大赛国奖作品_4. 界面设计
  2. 数据分析(SQL)常见面试题:开窗函数
  3. python选课系统代码_python模拟选课系统
  4. if __name__ == __main___一文带你弄懂python中if __name__ == #39;__main__#39;
  5. r语言中的或怎么表示什么不同_R经典入门 之 R语言的基本原理与概念 -- 200430
  6. mysql百万级去重_mysql优化小技巧之去除重复项(百万级数据)
  7. python 格式化输出%和format
  8. mixin机制 vue_vue mixins组件复用的几种方式(小结)
  9. 【Android】Android Studio中新创建的app目录结构
  10. 20155302 2016-2017-2 《Java程序设计》第六周学习总结