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

c语言动态分配内存空间

  • 内存
  • 2024-07-28 05:49:29
  • 5964

一、c语言中什么是动态分配内存?C语言使用函数malloc动态分配内存指针用于释放内存
malloc原型:externvoid*malloc(unsignedintnum_bytes);
用法:#include
或#include
功能:用于在内存中申请空间,并分配长度为num_bytes字节的内存块
说明:如果分配成功,则返回一个指向分配的内存,否则返回空指针NULL。
当内存不再使用时,应使用free()函数释放内存块。
调用格式,
指针名称=(指针指向的对象的数据类型*)malloc(number*sizeof(指针指向的对象的数据类型)对应的例子如下:
int*p=(int*)malloc(n*sizeof(int));
示例:
//malloc.c
#include
#include
main()
{
char*p;
clrscr();//清屏
p=(char*)malloc(100);
if(p)
printf("内存分配于:%x",p);
else
printf("NotEnoughMemory!\n");
if(p)
free(p);
getchar();
return0;
}


二、关于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的长度分配两个连续的区域,强制其为stu类型,并将其首地址赋给指针变量ps。
c函数:
该函数的原型为void*realloc(void*ptr,unsignedintsize)
重新定义打开的内存空间的大小。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';//分配的第一个字节空间将存储字母'哦'。
*(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()打开。malloc()总是返回第0个字节的地址,并且返回值必须是char*类型,所以在存储之前必须用(int*)强制其为整数类型。指向整数类型ptr的指针。
当使用malloc()函数分配空间时,如果计算机无法提供足够的空间分配,则会返回NULL指针。因此,如果返回的指针为NULL,则意味着没有足够的空间可供分配。


三、c语言中变量所分配的内存空间大小由变量的类型决定。C语言中的变量一般分为全局变量、局部变量和动态分配内存的变量。它们在内存中占用的存储区域不同,全局变量一般分配在静态存储区域。非静态局部变量(包括形参)一般分配在内存中的动态存储区域中。这个存储区域就是一个称为栈的区域。另外,C语言允许创建动态内存分配区域来存储一些临时数据。这些变量不需要在程序的声明部分定义,也不需要等到函数退出时自动释放。房间。该数据存储在称为堆区域的特殊空闲存储区域中。您可以根据需要向系统申请必要的空间。由于它们在声明部分没有定义为变量或数组,因此无法通过变量名或数组名引用这些数据,而只能通过指针引用。