当前位置:首页 > 内存 > 正文

c语言动态内存分配

  • 内存
  • 2024-05-03 13:16:09
  • 4300

一、关于C语言动态分配内存的问题要实现动态内存分配,除了使用包含指针成员的结构体之外,还必须使用C语言提供的几个标准库函数(头文件“alloc.h”或“malloc.h”或“stdlib.h”)。使用时必须包含)
函数
函数原型为void*malloc(unsignedintsize);在内存动态存储区域中分配一块长度为“size”字节的连续区域。函数的返回值是区域的首地址。“类型说明符”指示该字段用于什么类型的数据。(类型说明符*)表示将返回值转换为该类型的指针。“大小”是一个无符号数。例如:pc=(char*)malloc(100);表示分配100字节的内存空间并强制其为字符数组类型。函数的返回值是一个指向字符数组的指针。pc变量指针。如果大小超过可用空间,则返回空指针值NULL。
函数
函数原型为void*calloc(unsignedintnum,unsignedintsize)
根据给定的数据个数和每个数据占用的字节数创建存储空间。其中num为数据个数,size为每个数据占用的字节数,所以总共打开的字节数为num*size。该函数返回存储区的起始地址。calloc函数和malloc函数唯一的区别是可以同时分配n个区域块。例如:ps=(structstu*)calloc(2,sizeof(structstu));其中sizeof(structstu)应该找到Stu的结构长度。因此,这条指令的含义是:根据stu的长度分配2个连续的区域,强制转换为stu类型,并将其首地址赋给ps指针变量。
3、realloc函数:
函数原型为void*realloc(void*ptr,unsignedintsize)
重新定义开辟内存空间的大小。ptr指向的内存空间是通过上述函数打开的,大小是该空间的新大小,其值可能比原的大或小。该函数返回新内存区域的起始地址(该地址可能与之前的地址不同)。例如,p1=(float*)realloc(p1,16);将原来分配的8字节调整为16字节。
​**动态申请的内存空间必须使用free()函数手动释放
​示例:
​char*p;
​p=(char*)malloc(8);//开辟一个8字节的存储空间,将地址赋给指针p,通过指针p访问该空间。
*p='L';//存储字符,分配空间的第0个字节存储L
*(p+1)='o';//分配空间的第1个字节存储字符‘o’。
                                                                                                                                       ;
put(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,则意味着没有足够的剩余空间可供分配。
二、C语言中的malloc函数用法>?

在C语言中,malloc是动态内存分配函数。

函数原型:void*malloc(unsignedintnum_bytes)。

参数:num_bytes是一个无符号整数,用于表示分配的字节数。

注意:当内存不再使用时,应使用free()函数释放内存块。函数返回的指针必须正确对齐,以便它可以与任何数据对象一起使用。至于这个函数的原型,malloc之前返回的是一个字符指针。新的ANSIC标准规定该函数返回一个void指针,因此必要时需要进行类型转换。

实现malloc的方法:

首先我们需要确定所使用的数据结构。一个简单可行的解决方案是将堆内存空间以块的形式组织起来。每个块由元区域和数据区域组成。元区域记录了数据块的元信息(数据区域大小、空闲标志位、指针等)。

数据区是实际分配的内存区域,数据区的首字节地址是malloc返回的地址。