【问题标题】:Can I have an array with indeterminate length in C?我可以在 C 中有一个长度不确定的数组吗?
【发布时间】:2020-04-07 08:07:45
【问题描述】:

所以我是 c 的初学者,我正在做这个程序,用户在数组中输入值,如果值是 101,那么程序就完成了。问题是我不希望初始化数组的长度,而是当用户输入 101 时,会有最后一个值和数组中的最后一个位置。例如,他们在第三位输入了 101,那么数组的长度将为 4。我不知道这是否可能。

#include <stdio.h>


int main(void) {

  int i,j;
  int a[i];

 for(i=0;i<10;i++)
 {
   printf("Enter Value Nummber %d:",i);
   scanf("%d",&a[i]);


   if 
     (a[i] == 101) break;
     else continue;


 }

在这里,我将最大长度设置为 10,但是,例如,如果用户只给出 4 个值,然后给出 101,那么它会给出其余的点垃圾值。

【问题讨论】:

  • 首先:int a[i] 是错误的,因为此时尚未设置 i,因此包含随机垃圾。至于您的问题,您可以使用动态分配函数realloc 将数组大小连续增加1。但这通常不是这样做的,因为连续重新调整数组大小效率低下。通常会设置一个最大大小,然后跟踪数组中已填充了多少条目。
  • 关于“它是如何工作的”,答案是它不起作用i 的值将是不确定的,它可以是任何看似随机或垃圾的值,包括零或一百万或负一万或完全不同的值。

标签: c arrays memory initialization


【解决方案1】:

在这种情况下

  int a[i];

被称为variable length array,并且您正在使用i unialized,并且可以调用undefined behaviour。您需要先定义i 的值,然后才能使用它。

也就是说,更简洁的方法将是(不使用动态分配和调整大小)

  • 定义一个上限 (#define MAXLEN 100) 并使用它来创建一个数组,并将其初始化为一个值(例如,0)。
  • 继续询问用户输入,直到(以较早者为准)

    • 你得到一个值101
    • 计数器到达MAXLEN

否则,如果您可以使用分配的内存(malloc()/ realloc() 和家人),那么:

  • 定义起始大小 (#define INITSIZ 32)
  • 使用malloc()为该大小分配内存。
  • 询问用户输入。
  • 如果得到101的输入值,free()分配的内存并退出。
  • 否则,一旦达到大小,使用 realloc() 将分配加倍并继续上一步。

【讨论】:

  • @4386427 VLA 将如何提供帮助?它仍然无法调整大小,对吗?无论如何,用户不会提供数组维度,所以...
  • @4386427 嗯,好的,当然
【解决方案2】:

我建议您查看malloc。它允许您动态分配内存并为您提供一个指向已分配内存开始的指针。

您可以使用指向第一个元素的指针访问元素,然后每次添加值时增加指针。与其他语言不同,C 不会阻止您访问数组之外​​的值,因此请使用计数器跟踪添加的项目数,并确保留在分配的内存中(因此将长度保存在变量中)。然后,您可以将 for 循环替换为无限循环,并在用户输入值 101break。当您达到分配内存的限制时,您可以分配一个两倍大小的新数组(因此请确保将长度保存在变量中)并将前一个数组复制到那里,然后free 第一个数组。

【讨论】:

  • 没错,我编辑了我的答案,以便更清楚地了解数组和指针。我认为在这一点上更详细地介绍对 OP 没有帮助。
【解决方案3】:

"我可以有一个长度不定的数组吗?"

我不希望数组的长度被初始化,而是当用户输入 101 时会有最后一个值和数组中的最后一个位置。例如他们在第三位输入了 101,那么数组的长度就是 4。我不知道这是否可能。

不,这是不可能的。

int a[i];

您不能写入不确定的数组,因为 i 未初始化 - 它包含垃圾值。

任何此类尝试都是未定义的行为,没有多大意义。

如果没有为第三个元素分配空间,你想如何存储用户放入假定第三个​​元素的值?

当然,您可以使用 VLA 或分配和重新分配动态内存(正如其他两个答案所建议的那样),但您不能将数据写入未分配用于存储该值的内存。

我不明白你背后的想法。也许你会解释你想要实现的更大目标。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-27
    • 2015-10-17
    • 2012-12-23
    • 1970-01-01
    相关资源
    最近更新 更多