­

C语言动态内存分配

  • 2019 年 10 月 27 日
  • 筆記

C动态内存分配

数组是固定数量的值的集合,在声明数组的大小之后,无法更改。有时,数组大小可能不够,就需要动态扩容。解决此问题,可以在运行时手动分配内存。这在C编程中称为动态内存分配

动态分配存储器涉及到的库函数有

  • malloc()

  • calloc()

  • realloc()

  • free()

这些函数在<stdlib.h>头文件中定义。


1.malloc()

名称“ malloc”代表内存分配,memory allocation。

malloc()函数保留指定字节数的内存块。并且,它返回一个指针void可铸造成任何形式的指针。


malloc()的语法

ptr = (castType*) malloc(size);

ptr = (int*) malloc(100 * sizeof(float));

上面的语句分配了400个字节的内存。这是因为float的大小为4个字节。并且,指针ptr保存分配的存储器中的第一个字节的内存地址。

如果无法分配内存,则表达式将产生一个NULL指针。


2.calloc()

名称“ calloc”代表连续分配,contiguous allocation。

malloc()函数分配内存,但不初始化内存。而calloc() 函数分配内存并将所有位初始化为零。


calloc()的语法

ptr = (castType*)calloc(n, size);

例:

ptr = (float*) calloc(25, sizeof(float));

上面的语句为float类型的25个元素在内存中分配了连续的空间。


3.free()

使用calloc()malloc()不单独释放创建的动态分配内存,必须明确使用free()释放空间。


free()的语法

free(ptr);

该语句释放由指向的内存中分配的空间ptr


示例1: malloc()和free()

// Program to calculate the sum of n numbers entered by the user  #include <stdio.h>  #include <stdlib.h>  int main()  {      int n, i, *ptr, sum = 0;      printf("Enter number of elements: ");      scanf("%d", &n);      ptr = (int*) malloc(n * sizeof(int));        // if memory cannot be allocated      if(ptr == NULL)      {          printf("Error! memory not allocated.");          exit(0);      }      printf("Enter elements: ");      for(i = 0; i < n; ++i)      {          scanf("%d", ptr + i);          sum += *(ptr + i);      }      printf("Sum = %d", sum);        // deallocating the memory      free(ptr);      return 0;  }

在这里,我们已为n个数字动态分配了内存


示例2: calloc()和free()

// Program to calculate the sum of n numbers entered by the user  #include <stdio.h>  #include <stdlib.h>  int main()  {      int n, i, *ptr, sum = 0;      printf("Enter number of elements: ");      scanf("%d", &n);      ptr = (int*) calloc(n, sizeof(int));      if(ptr == NULL)      {          printf("Error! memory not allocated.");          exit(0);      }      printf("Enter elements: ");      for(i = 0; i < n; ++i)      {          scanf("%d", ptr + i);          sum += *(ptr + i);      }      printf("Sum = %d", sum);      free(ptr);      return 0;  }

4.realloc()

如果动态分配的内存不足或超出要求,则可以使用该realloc()功能更改以前分配的内存的大小。


realloc()的语法

ptr = realloc(ptr, x);

在这里,ptr以新的大小x重新分配。


示例3: realloc()

#include <stdio.h>  #include <stdlib.h>  int main()  {      int *ptr, i , n1, n2;      printf("Enter size: ");      scanf("%d", &n1);      ptr = (int*) malloc(n1 * sizeof(int));      printf("Addresses of previously allocated memory: ");      for(i = 0; i < n1; ++i)           printf("%un",ptr + i);      printf("nEnter the new size: ");      scanf("%d", &n2);      // rellocating the memory      ptr = realloc(ptr, n2 * sizeof(int));      printf("Addresses of newly allocated memory: ");      for(i = 0; i < n2; ++i)           printf("%un", ptr + i);        free(ptr);      return 0;  }

运行该程序时,输出为:

输入大小:2  先前分配的内存的地址:26855472  26855476    输入新的尺寸:4  新分配的内存地址:26855472  26855476  26855480  26855484