C言语中的动态内存办理。C言语为内存的分配和办理供给了几个函数。这些函数能够在 <stdlib.h> 头文件中找到。

在C言语中,内存是通过指针变量来办理的。指针是一个变量,它存储了一个内存地址,这个内存地址能够指向任何数据类型的变量,包含整数、浮点数、字符和数组等。C言语供给了一些函数和运算符,使得程序员能够对内存进行操作,包含分配、开释、移动和仿制等。

C语言编程—内存管理

留意: void * 类型表明未确定类型的指针。C、C++ 规定 void * 类型能够通过类型转化强制转化为任何其它类型的指针。

动态分配内存

编程时,假如您预先知道数组的巨细,那么界说数组时就比较简单。例如,一个存储人名的数组,它最多容纳 100 个字符,所以您能够界说数组,如下所示:

char name[100];

但是,假如您预先不知道需求存储的文本长度,例如您想存储有关一个主题的详细描绘。在这里,咱们需求界说一个指针,该指针指向未界说所需内存巨细的字符,后续再根据需求来分配内存,如下所示:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
   char name[100];
   char *description;
   strcpy(name, "Zara Ali");
   /* 动态分配内存 */
   description = (char *)malloc( 200 * sizeof(char) );
   if( description == NULL )
   {
      fprintf(stderr, "Error - unable to allocate required memory\n");
   }
   else
   {
      strcpy( description, "Zara ali a DPS student in class 10th");
   }
   printf("Name = %s\n", name );
   printf("Description: %s\n", description );
}

当上面的代码被编译和执行时,它会发生下列成果:

Name = Zara Ali
Description: Zara ali a DPS student in class 10th

上面的程序也能够运用 calloc() 来编写,只需求把 malloc 替换为 calloc 即可,如下所示:

calloc(200, sizeof(char));

当动态分配内存时,您有完全控制权,能够传递任何巨细的值。而那些预先界说了巨细的数组,一旦界说则无法改变巨细。

从头调整内存的巨细和开释内存

当程序退出时,操作系统会主动开释所有分配给程序的内存,但是,主张您在不需求内存时,都应该调用函数 free() 来开释内存。

或许,您能够通过调用函数 realloc() 来添加或削减已分配的内存块的巨细。让咱们运用 realloc() 和 free() 函数,再次查看上面的实例:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
   char name[100];
   char *description;
   strcpy(name, "Zara Ali");
   /* 动态分配内存 */
   description = (char *)malloc( 30 * sizeof(char) );
   if( description == NULL )
   {
      fprintf(stderr, "Error - unable to allocate required memory\n");
   }
   else
   {
      strcpy( description, "Zara ali a DPS student.");
   }
   /* 假定您想要存储更大的描绘信息 */
   description = (char *) realloc( description, 100 * sizeof(char) );
   if( description == NULL )
   {
      fprintf(stderr, "Error - unable to allocate required memory\n");
   }
   else
   {
      strcat( description, "She is in class 10th");
   }
   printf("Name = %s\n", name );
   printf("Description: %s\n", description );
   /* 运用 free() 函数开释内存 */
   free(description);
}

当上面的代码被编译和执行时,它会发生下列成果:

Name = Zara Ali
Description: Zara ali a DPS student.She is in class 10th

您能够尝试一下不从头分配额外的内存,strcat() 函数会生成一个过错,由于存储 description 时可用的内存不足。

C 言语中常用的内存办理函数和运算符

  • malloc() 函数:用于动态分配内存。它承受一个参数,即需求分配的内存巨细(以字节为单位),并回来一个指向分配内存的指针。
  • free() 函数:用于开释从前分配的内存。它承受一个指向要开释内存的指针作为参数,并将该内存标记为未运用状况。
  • calloc() 函数:用于动态分配内存,并将其初始化为零。它承受两个参数,即需求分配的内存块数和每个内存块的巨细(以字节为单位),并回来一个指向分配内存的指针。
  • realloc() 函数:用于从头分配内存。它承受两个参数,即一个从前分配的指针和一个新的内存巨细,然后尝试从头调整从前分配的内存块的巨细。假如调整成功,它将回来一个指向从头分配内存的指针,否则回来一个空指针。
  • sizeof 运算符:用于获取数据类型或变量的巨细(以字节为单位)。
  • 指针运算符:用于获取指针所指向的内存地址或变量的值。
  • & 运算符:用于获取变量的内存地址。
    • 运算符:用于获取指针所指向的变量的值。
  • -> 运算符:用于指针访问结构体成员,语法为 pointer->member,等价于 (*pointer).member。
  • memcpy() 函数:用于从源内存区域仿制数据到方针内存区域。它承受三个参数,即方针内存区域的指针、源内存区域的指针和要仿制的数据巨细(以字节为单位)。
  • memmove() 函数:类似于 memcpy() 函数,但它能够处理重叠的内存区域。它承受三个参数,即方针内存区域的指针、源内存区域的指针和要仿制的数据巨细(以字节为单位)。

malloc与calloc没有本质区别,malloc之后的未初始化内存能够运用memset进行初始化。

首要的不同是malloc不初始化分配的内存,calloc初始化已分配的内存为0。

次要的不同是calloc回来的是一个数组,而malloc回来的是一个目标。

calloc等于malloc后再memset,所以malloc比calloc更高效。

分配内存空间函数malloc 调用形式: (类型说明符*) malloc (size) 。

分配内存空间函数 calloc calloc 也用于分配内存空间。

为什么多用malloc而很少用calloc?

由于calloc虽然对内存进行了初始化(悉数初始化为0),

calloc相当于

p = malloc();

memset(p, 0,size);

相对于malloc多了对内存的写零操作,而写零这个操作咱们有时候需求,而大部分时刻不需求。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。