问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

关于C语言动态分配内存的问题

发布网友 发布时间:2022-04-30 02:31

我来回答

3个回答

热心网友 时间:2022-04-26 20:05

  要实现动态内存的分配,除了利用含指针成员的结构体之外,还需利用C语言提供的几个标准库函数。(使用时应包含头文件“alloc.h”或“malloc.h”或“stdlib.h”)
  1.malloc函数
  函数原型为void *malloc(unsigned int size);在内存的动态存储区中分配一块长度为"size" 字节的连续区域。函数的返回值为该区域的首地址。 “类型说明符”表示把该区域用于何种数据类型。(类型说明符*)表示把返回值强制转换为该类型指针。“size”是一个无符号数。例如: pc=(char *) malloc (100); 表示分配100个字节的内存空间,并强制转换为字符数组类型,函数的返回值为指向该字符数组的指针, 把该指针赋予指针变量pc。若size超出可用空间,则返回空指针值NULL。
  2.calloc 函数
  函数原型为void *calloc(unsigned int num, unsigned int size)
  按所给数据个数和每个数据所占字节数开辟存储空间。其中num为数据个数,size为每个数据所占字节数,故开辟的总字节数为 num*size。函数返回该存储区的起始地址。calloc函数与malloc 函数的区别仅在于一次可以分配n块区域。例如: ps=(struct stu*) calloc(2,sizeof (struct stu)); 其中的sizeof(struct stu)是求stu的结构长度。因此该语句的意思是:按stu的长度分配2块连续区域,强制转换为stu类型,并把其首地址赋予指针变量ps。
  3. realloc函数:
  函数原型为void *realloc(void *ptr, unsigned int size)
  重新定义所开辟内存空间的大小。其中ptr所指的内存空间是用前述函数已开辟的,size为新的空间大小,其值可比原来大或小。函数返回新存储区的起始地 址(该地址可能与以前的地址不同)。例如p1=(float *)realloc(p1,16);将原先开辟的8个字节调整为16个字节。
  **动态申请的内存空间要进行手动用free()函数释放

  例子:

  char *p;
  p=(char*)malloc(8);//开辟8个字节的存储空间,并把地址赋给指针p,通过指针p对该空间进行存取操作。
  *p='L'; //存储字符,所分配空间的第0字节存储L
  *(p+1)='o';//分配空间的第一字节存储字符'o'.
  *(p+2)='v';
  *(p+3)='e';
  *(p+4)='\0';
  puts(p);//输出字符串
  free(p);//释放空间
  注意:*(p+n)等价于p[n],(p+n)是地址,而*(p+n)就是取地址(p+n)的内容。
  如上面程序中的*(p+1)='A';可写成p[1]='A';
  malloc()函数的参数可以是常数、变量或表达式等。除了存放字符串外,malloc()也可取得空间来存储整数等数据。例如存储整数分配空间如下:
  int *ptr;
  ptr=(int *)malloc(sizeof(int)*4);
  malloc()开辟空间存储4个整数数据,由于malloc()总传回第0字节的地址,且返回值必定是char*类型,所以要通过(int *)来强制转换为指向整型后存入指向整型的指针ptr.
  当用malloc()函数分配空间时,若计算机无法提供足够的空间分配则会返回NULL指针。所以,若返回的指针为NULL,就表示可分配的剩余空间已不足。

热心网友 时间:2022-04-26 21:23

malloc并不保证两次分配的内存是连续的,malloc是C语言规定实现的一个函数,但这个函数并没你想的那么简单,不同的编译器可能实现不同。。。 这个函数时在内存管理器的一个接口函数,你分配的整个动态存储区,都是在链表管理之下的。。既然是链表,你申请的内存是一个链表的节点。。。
给你举个例子你要申请一个内存实际上他占用的是
node{
listhead;
size;
data;
} 而你得到的指针只是结构体中data的指针,listhead 和size 就在你的数据前面也占内存,起始动态内存全都是要有内存管理器才能实现它的功能的,只是C语言的标准方法有点简单,而且缺点很多,频繁申请释放会造成大量内存碎片,对于使用者为了避免这种情况,通常都是先申请内存池,然后在内存池中用自己的一套规则分配内存,避免产生大量碎片。。

热心网友 时间:2022-04-26 22:57

两次连续的malloc并不保证地址的连续,只有一次malloc分配多个,才能保证内存地址的连续性。
这个在malloc的官方说明里面有提到,作为内存管理的优化设计,是寻找最合理的空间大小去分配,因为空闲内存是不连续的,如果分配的大小刚好是某个空闲区块大小,则优先。追问两个问题
一 怎样一次分配多个呢?
二 我分开分配了3次 为什么他们之间差的值相等呢? 而且差的值和我后面的算式有关系

追答

q[0]=(int *)malloc(100*sizeof(int));//这样就分配了100个连续的。

你纠结这个没有意义,有不是研究win内存管理机制。如果需要连续地址,那么一次分配就可以了。

q[0]=(int *)malloc(3*sizeof(int));
q[1]=q[0]+1;
q[2]=q[0]+2;

这样就是连续分配了3个,访问也没有问题。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
玉米仁子饭产自哪里 中国期货交易所的交易品种有哪些? 历史要怎么读,有啥诀窍 高中历史诀窍 年终会活动策划方案 深度解析:第一财经回放,探索财经新风向 逆水寒手游庄园怎么邀请好友同住 逆水寒手游 逆水寒不同区可以一起组队吗? 逆水寒手游 逆水寒怎么进入好友世界? 逆水寒手游 逆水寒怎么去别人的庄园? 如何给二维数组动态分配内存空间(转) 怎么使用new和delete动态分配内存 为什么要使用动态内存分配函数malloc,怎样使用malloc函数? malloc()函数怎么体现动态分配内存?已经分配好的内存,要往里面再加数据,内存空间会自动调大吗? 怎么查看动态分配内存空间的大小(c语言)。 C语言中的动态内存分配的用法举例 C语言如何动态分配存储空间 请教理论,为什么需要“动态”分配内存空间? c语言中什么是动态分配内存? 梦见猫被人杀死吊死祭祀 谁知道石家庄,济南,烟台工行ATM站点号为0215是哪啊?我先谢谢了 梦见老公和我在鸡窝打死野猫,猫血溅到我身上 济南工行有几家 梦见老公和我一起杀死一只猫 中国工商银行 地区号1602 网点号0010 梦到老公把小猫活活摔死?? 中国工商银行地区号1309网点号2254具体是哪家银行? 游戏王龙族卡组求改!!! 梦见老公杀野猫 周末,就是今天,东营西城哪个工商银行开门啊?跪求各位大神帮助哈 c语言程序怎么实现动态内存分配? 什么是c语言里面的动态存储分配函数啊? C/C++如何分配未知长度的数组的内存空间?动态内存分配? c语言 动态分配内存空间 程序如下:请问哪里错了,应该怎么修改?谢谢 C语言中如何动态增加内存空间 鱼背部的那条鱼腥线在哪?怎么去掉? 如何去掉草鱼的腥线? 北京西直门北大街铁路小区属于哪个区? 中锐股份股票东方财富 中锐股份涨停原因 中锐股份为什么涨停 游泳的解梦 北京市西直门北大街58号院6号楼坐地铁怎么走 北京市西直门北大街49号铁路小区的邮编是多少啊,是海淀区。 北京市海淀区西直门北大街依都阁(19号D室)邮编是什么? 中锐股份怎么样 海淀区西直门北大街属于几环 北京市西直门北大街到沙河261医院怎么坐地铁? 北京南站到西直门北大街,公交或地铁怎么坐? centos 下mysql怎么定时备份到本地