在C语言中,动态内存分配的概念使得C程序员可以在运行时分配内存。C语言中的动态内存分配可以通过stdlib.h头文件中的4个函数来实现。

  1. malloc()
  2. calloc()
  3. realloc()
  4. free()

在学习上述函数之前,让我们先了解静态内存分配和动态内存分配之间的区别。

静态内存分配动态内存分配
在编译时分配内存在运行时分配内存
程序执行时无法增加内存程序执行时可以增加内存
用于数组用于链表

现在让我们快速了解一下用于动态内存分配的方法。

malloc()分配单个请求的内存块。
calloc()分配多个请求的内存块。
realloc()重新分配malloc()或calloc()函数占用的内存。
free()释放动态分配的内存。

malloc()函数

malloc()函数分配单个请求的内存块。

在执行时不会初始化内存,所以初始时内存中有垃圾值。

如果内存不足,则返回NULL。

malloc()函数的语法如下:

ptr = (cast-type*) malloc(byte-size);

让我们看一个malloc()函数的例子:

#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)); // 使用malloc分配内存

   if (ptr == NULL) {
      printf("Sorry! unable to allocate memory");
      exit(0);
   }

   printf("Enter elements of array: ");
   for (i = 0; i < n; ++i) {
      scanf("%d", ptr + i);
      sum += *(ptr + i);
   }

   printf("Sum=%d", sum);

   free(ptr); // 释放内存

   return 0;
}

输出结果如下:

Enter number of elements: 3
Enter elements of array: 10
10
10
Sum=30

calloc()函数

calloc()函数分配多个请求的内存块。

它会将所有字节的初始值设置为零。

如果内存不足,则返回NULL。

calloc()函数的语法如下:

ptr = (cast-type*) calloc(number, byte-size);

让我们看一个calloc()函数的例子:

#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)); // 使用calloc分配内存

   if (ptr == NULL) {
      printf("Sorry! unable to allocate memory");
      exit(0);
   }

   printf("Enter elements of array: ");
   for (i = 0; i < n; ++i) {
      scanf("%d", ptr + i);
      sum += *(ptr + i);
   }

   printf("Sum=%d", sum);

   free(ptr); // 释放内存

   return 0;
}

输出结果如下:

Enter number of elements: 3
Enter elements of array: 10
10
10
Sum=30

realloc()函数

如果malloc()或calloc()函数的内存不足,可以通过realloc()函数重新分配内存。简而言之,它改变了内存的大小。

realloc()函数的语法如下:

ptr = realloc(ptr, new-size);

free()函数

malloc()或calloc()函数分配的内存必须通过调用free()函数释放。否则,它将占用内存,直到程序退出。

free()函数的语法如下:

free(ptr);

标签: c语言, c语言教程, c语言技术, c语言学习, c语言学习教程, c语言下载, c语言开发, c语言入门教程, c语言进阶教程, c语言高级教程, c语言面试题, c语言笔试题, c语言编程思想