动态与动态创建的数组在C中

时间:2014-09-09 17:00:34

标签: c arrays

我参加编程I课程,这是我教科书的摘录:

"有两种基本方法可以静态和动态地创建数组。请注意,动态创建的数组与动态数组不同;动态创建的数组只能在C中固定大小。"

我的教授说的是与这句话非常矛盾的事情,当我提出进一步的问题时,他们会非常回避。他似乎并不承认动态与固定大小和动态创建与静态创建之间存在差异。我不太了解C与他争论,因为他是编写教科书的人,我此刻有点失落。

  1. 静态创建与动态创建和动态与静态数组之间有什么区别?
  2. 做"动态" (不是动态创建的)数组存在于C?
  3. 教科书是"编程的艺术和工艺:C版"作者:John Lusth。事实上,我的教授是写作教授的人我错了,作者是我学校不同的CS教授。

5 个答案:

答案 0 :(得分:3)

当教授使用动态词时,意味着数组可以动态改变其大小。也就是说,可以在数组中添加或删除新元素。 动态分配的数组意味着在堆中的运行时分配数组。在main函数获得控件之前分配静态分配的数组。

考虑到C具有可变长度数组(VLA)。它与动态数组不同。 VLA意味着可以使用不同的大小重新创建阵列。但是在每次这​​样的娱乐活动中,你都会创建一个新阵列。

动态数组的一个示例是标准C ++类std::vector

答案 1 :(得分:3)

这个问题的答案将取决于人们如何想要处理像“阵列”和“动态”这样的术语。 “数组”是否应该将exclusibely引用到数组类型?或者我们是否允许包含malloc - ed数组,可通过指针访问? “动态”是指动态内存(即使标准C术语不使用此术语)?或者我们是否也允许将本地 VLA 视为“动态”?

无论如何,可以将数组分成三个概念类别

  1. 编译时大小的数组
  2. 具有运行时初始大小的数组,无法调整大小
  3. 具有运行时初始大小的数组,可以调整大小
  4. 显然,你的教授将第二类称为“动态创建的数组”,将第三类称为“动态”数组。

    例如,第一类的数组是经典的内置C89 / 90样式C数组

     int a[10];
    

    第二类阵列是C99 VLAs

     int a[n];
    

    (或{+ 1}} - C ++中的数组。)

    第三类的数组是使用new

    分配的数组
    malloc

    稍后可以使用 int *a = malloc(n * sizeof *a); 调整大小。

    当然,一旦我们超越核心语言的内置功能,这些类别之间的划分就变得纯粹是概念性的。这只是阵列实现为用户提供的接口问题。例如,可以通过破坏旧的固定大小数组并分配不同大小的新数组,从第三类到第二类数组实现数组。实际上,这就是realloc在一般情况下允许工作的方式。

答案 2 :(得分:1)

这里的问题是术语没有正式定义,所以当不同的人使用这些词时,它们可能意味着不同的东西。

我认为你的教科书区分了这三个定义:

静态数组

一个大小被硬编码到源中的数组:

int ages[100];
ages[0] = 1;
  • 缺点:当你编码时,你必须知道它有多大。
  • 优点:当变量超出范围时,运行时会自动收回存储空间。

动态分配数组

在创建数组之前,在运行时决定其大小的数组。

numberOfAges = (some calculation);
int *ages = (int*) malloc(numberOfAges);
ages[0] = 1;

在这种情况下,在编译时不知道数组的大小。它是在运行时决定的,但是一旦创建了数组,它的大小就不会改变。

  • 优点:根据运行时的要求,您可以使其大小不同。
  • 缺点:您必须自己调用代码free()来回收存储空间。

动态数组

这是一个在其生命周期内大小增大或缩小的数组。

假设语言可能包含以下语句:

resize(ages, 5); // make "ages" 5 longer
truncate(ages, 3); // make "ages" 3 long, discarding later elements.

你的教授正确地说,C的核心没有可以做到这一点的数组。 char*在分配的位置是固定大小,并且永远不会改变。

在C中,如果需要长度增长或缩小的值列表,则必须滚动自己的代码才能执行此操作,或者使用提供它的函数库。您可以使用库提供的API,而不是直接使用数组。实际上,它可能看起来非常像上面的假设示例,除了ages不是int* - 它将是库提供的某种类型。

#include <resizeableIntArrays.h>
...
ResizeableIntArray ages = allocateResizeableIntArray(100);
resize(ages,80);

有很多方法可以实现这一点 - 使用realloc(),使用链接列表或二叉树,使用链接的数组列表。我怀疑当你的教授“回避”时,他真的会把更复杂的东西保存到以后。任何受人尊敬的C课程最终都会得到这些东西,但如果普通的数组对你来说是新手,那么在你准备链接列表之前几周就会有。

答案 3 :(得分:0)

静态创建的数组是那些在声明期间大小为常量的数组,如

int arr[10];

动态创建的数组是那些大小作为变量给出的数组。因为变量在数组声明期间可以取任何值,size取决于该程序实例的变量值,如

int n;
scanf("%d",&n);
int arr[n];

对于你的第二个问题:动态数组(在程序执行期间改变其大小的数组)在C中不存在。你可以创建一个动态内存分配的链接列表,这本质上是一个动态线性数据结构(相比之下)到一个静态线性数据结构,该数组是)。

答案 4 :(得分:0)

动态创建的数组表示在运行时创建数组。它可能是一个可变长度数组

int n = 5;
int a[n]; 

或使用malloc

创建
int *a;
a = malloc(sizeof(int) * 5);  // But note that pointers are not arrays  

在C中,没有动态数组。您无法向其中添加或删除新元素,即一旦创建了数组,其大小就无法更改。