【问题标题】:How to convert static array to dynamic array in c?如何在c中将静态数组转换为动态数组?
【发布时间】:2020-04-24 04:46:06
【问题描述】:

假设我有一个静态数组

int a[10];

在某些时候我想插入第 11 个元素的程序。所以它会抛出错误,因为索引超出范围错误。

所以我想创建动态数组a[]。不改变静态数组。而且我想在运行时对数组a[] 进行更多输入(意味着可伸缩性)。

【问题讨论】:

  • 这是什么意思? “所以我想创建动态数组 a[]。而不改变静态数组。”
  • “所以它会抛出错误,因为索引超出范围错误。”它不会做这样的事情。你只会覆盖随机内存并创建一个安全漏洞,没有安全网来警告你。
  • 一旦数组定义,它的大小就不能改变。而是为数组分配内存。
  • @JosephSible-ReinstateMonica 它具有未定义的行为。抛出超出范围的错误(无论“抛出”在 C 中可能意味着什么)是无限多种可能性之一。它很可能会破坏数组外的内存——除非编译器基于其行为已定义的假设优化了代码。

标签: c arrays dynamic-memory-allocation


【解决方案1】:

int a[10]; 替换为int *a = malloc(10 * sizeof(int));。当您想将其扩展到 11 个元素时,请执行 a = realloc(a, 11 * sizeof(int));。如果前两个函数中的任何一个返回 null,那么您的内存不足,应该将其视为错误。最后,如果您的原始数组超出范围,请输入free(a);

【讨论】:

  • realloc(a, 11 * sizeof(int)) 的一个不错的替代品是realloc(a, 11 * sizeof *a)。没有“代码是否使用了正确的类型?”更容易正确编码、审查和维护。错误。
【解决方案2】:

我认为你不能在 C 中静态增加数组大小。

当涉及到静态时——我们不能动态地增加数组的大小,因为我们将在声明时明确定义它的大小。 但是,您可以在运行时使用 stdlib.h 标头中的 realloc() 动态执行此操作。但是当您使用 malloc() 动态创建数组时。

这种情况下的典型反应是分配一个更大的新数组并从旧数组中复制现有元素,然后释放旧数组。
有一些资源可以帮助您理解这一点。 here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-07
    • 2019-08-07
    • 1970-01-01
    • 2021-07-22
    • 1970-01-01
    • 2011-02-09
    • 1970-01-01
    • 2011-07-04
    相关资源
    最近更新 更多