在 C 语言中动态分配数组

Jinku Hu 2023年10月12日
  1. 使用 malloc 函数在 C 语言中动态分配数组
  2. 使用 realloc 函数修改 C 语言中已经分配的内存区域
  3. 使用宏在 C 语言中实现给定对象的数组分配
在 C 语言中动态分配数组

本文将演示如何在 C 语言中动态分配数组的多种方法。

使用 malloc 函数在 C 语言中动态分配数组

malloc 函数是在堆上分配动态内存的核心函数。它分配给定的字节数,并返回指向内存区域的指针。因此,如果要动态分配某些对象类型的数组,首先应该声明一个类型的指针。接下来,应该通过传递元素数量乘以单个对象的大小作为参数来调用 malloc

在下面的例子中,我们分配内存来存储一个字符字符串。按照安全编码标准的要求,将 errno 设置为 0,并检查 malloc 调用返回的指针,以验证函数的成功执行。最后,利用 memmove 函数将字符串复制到分配的内存位置。

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define SIZE 100

const char *str = "random string to be moved";

int main() {
  char *arr = NULL;

  errno = 0;
  arr = malloc(SIZE * sizeof(char));
  if (!arr) {
    perror("malloc");
    exit(EXIT_FAILURE);
  }

  memmove(arr, str, strlen(str));
  printf("arr: %s\n", arr);

  free(arr);
  exit(EXIT_SUCCESS);
}

输出:

arr: random string to be moved

使用 realloc 函数修改 C 语言中已经分配的内存区域

realloc 函数用于修改之前由 malloc 调用分配的内存区域的大小。它将原始内存地址和新的大小作为第二个参数。注意,realloc 可能返回与传递的相同的指针,也可能根据请求的大小和给定地址后的可用内存返回不同的指针。同时,前一个数组的内容将保持不变,直到新指定的大小。

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define SIZE 100

const char *str = "random string to be moved";

int main() {
  char *arr = NULL;

  errno = 0;
  arr = malloc(SIZE);
  if (!arr) {
    perror("malloc");
    exit(EXIT_FAILURE);
  }

  int num = 102;  // User Provided Value
  for (int i = 0; i < num; ++i) {
    if (i > SIZE) {
      arr = realloc(arr, 2 * SIZE);

      if (!arr) {
        perror("realloc");
        exit(EXIT_FAILURE);
      }
    }

    arr[i] = 'a';
  }

  free(arr);
  exit(EXIT_SUCCESS);
}

使用宏在 C 语言中实现给定对象的数组分配

通常,malloc 用于分配一些用户定义结构的数组。由于 malloc 返回的是 void 指针,并且可以隐式转换为其他任何类型,所以比较好的做法是将返回的指针显式转换为对应的类型。因为它比较容易漏掉一些东西,并且不包含正确的标记,所以我们实现了一个宏表达式,取数组中的元素数和对象类型来自动构造正确的 malloc 语句,包括正确的强制转换。

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define SIZE 100

typedef enum {
  Jan,
  Feb,
  MAR,
  APR,
  MAY,
  JUN,
  JUL,
  AUG,
  SEP,
  OCT,
  NOV,
  DEC
} month;

typedef struct {
  unsigned char dd;
  month mm;
  unsigned yy;
} date;

#define MALLOC_ARRAY(number, type) ((type *)malloc((number) * sizeof(type)))

int main() {
  date *d = NULL;

  errno = 0;
  d = MALLOC_ARRAY(SIZE, date);
  if (!d) {
    perror("malloc");
    exit(EXIT_FAILURE);
  }

  free(d);
  exit(EXIT_SUCCESS);
}
作者: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

DelftStack.com 创始人。Jinku 在机器人和汽车行业工作了8多年。他在自动测试、远程测试及从耐久性测试中创建报告时磨练了自己的编程技能。他拥有电气/电子工程背景,但他也扩展了自己的兴趣到嵌入式电子、嵌入式编程以及前端和后端编程。

LinkedIn Facebook

相关文章 - C Array