【问题标题】:Initialising a variable 2-D array with a specific value使用特定值初始化可变二维数组
【发布时间】:2024-04-23 23:20:02
【问题描述】:

我知道我们可以用 0 来初始化一个二维数组

a[value_1][value_2] = {0};

如果我们写

a[value_1][value_2] = {number other than 0};

第一个元素由 { } 中给出的数字初始化,其余全部为 0。

但是,困扰我的是,我们如何初始化一个数组,其参数 value_1 和 value_2 已从用户那里获取输入,因为它显示可变大小的对象可能未初始化的错误。

此外,如果您也能说出关于多维数组(而不仅仅是二维数组)的相同信息,那将会很有帮助。

【问题讨论】:

  • 您是在专门谈论 C,还是可以使用 C++ 的 std::vector 代替?
  • 您必须更具体地说明您想要什么:C 和 C++ 在这一点上有所不同。 C,从 C99 开始,允许 value_1 等是动态的(在“VLA”下查找),C++ 没有,但有其他构造。
  • 我说的是 c 和 c++,但是使用了一种不会增加程序执行时间的方法。好吧,我不知道 std::vector 但是如果它会增加程序的执行时间,那么通过 for 循环方法初始化它会有什么区别。
  • @JensGustedt 你能告诉我如何在 c 和 c++ 中做到这一点吗?

标签: c++ c arrays multidimensional-array array-initialization


【解决方案1】:

在 C99 中执行此操作(使用 gcc -std=c99 编译):

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

int main ()
{
  int value_1, value_2;
  scanf("%d %d", &value_1, &value_2);

  int a[value_1][value_2];

  // initialize
  for (int i=0; i<value_1; i++)
    for (int j=0; j<value_1; j++)
      a[i][j] = 0;
  // or
  memset(a, 0, value_1*value_2*sizeof(int));

  return 0;
}

正如@JensGustedt 所指出的,在 C++ 中,不支持可变长度数组。另一方面,g++ 支持它,所以上面相同的代码也可以在那里工作。

据我所知,在 C 或 C++ 中不支持可变大小对象中的初始化程序。

【讨论】:

  • 这两种初始化方法是否占用相同的时间?
  • 这取决于您的编译器在优化方面的能力。如果效率比代码清晰更重要,我会使用memset 调用。
  • 不需要value_1*value_2*sizeof(int)sizeof a 就够了。
【解决方案2】:

您不能使用用户输入的值来初始化数组。 C 不允许这样做。

请参阅Dennis Ritchie

使用malloc() 函数可以实现同样的目的。

#include<stdio.h>
#include<malloc.h>

int main(void)
{
    int limit;
    printf("Enter the array limit:- ");
    scanf("%d",&limit);
    int *arr = (int*)malloc(sizeof(int) * limit);

    // The above statement allocates the memory equivalent to 3 integers

    // Now considering your limit is 3 and initializing values

    arr[0] = 43;
    arr[1] = 65;
    scanf("%d",&arr[2]);    // All of these work perfectly fine.

    return 0;
}

我希望这会有所帮助。同样,您也可以创建多维数组。在标准 C 中没有明确的方法来定义限制。 你不能这样做int arr[limit];

【讨论】:

  • C 从 1999 年开始支持可变长度数组。有关当前信息,请不要参考 1978 年的书籍。
  • 但是如果有人不使用 C99 编译标准呢?
  • OP 明确指出他们收到一条错误消息,指出可变大小的对象可能未初始化。这表明他们的编译器确实支持可变长度数组,但不支持初始化它们(因为 C 标准不支持)。所以我们知道他们正在使用支持现代可变长度数组的编译器,而 35 年前的引用是不合适的。如果有人想问关于历史 C 的问题,他们可以明确指出。