定义数组 C/C++

Defining Array C/C++

本文关键字:C++ 数组 定义      更新时间:2023-10-16

这两个数组定义之间有什么区别,哪个更正确,为什么?

#include <stdio.h>
#define SIZE 20
int main() {
    // definition method 1:
    int a[SIZE];
    // end definition method 1.
    // defintion method 2:
    int n;
    scanf("%d", &n);
    int b[n];
    // end definition method 2.
    return 0;
}

我知道如果我们从 stdin 中读取大小、变量n,将我们的(我们将使用的内存块(数组定义为指针并使用 stdlib.harray = malloc(n * sizeof(int)) 更正确,而不是将其贴花为 int array[n] ,但又为什么?

不是"更正确"或"不太正确"。要么异或不正确。特别是,这在 C 中有效,但在C++中不起作用。

您正在声明动态数组。将动态数组声明为

int *arr;  // int * type is just for simplicity
arr = malloc(n*sizeof(int*));  

这是因为可变长度数组只允许在 C99 中使用,而您不能在 C89/90 中使用它。

在(C99 之前(C 和 C++ 中,所有类型都是静态大小的。这意味着数组必须声明为编译器常量且已知的大小。

现在,许多C++编译器提供动态大小的数组作为非标准扩展,C99 明确允许它们。因此,如果您尝试一下,int b[n]很可能会起作用。但在某些情况下,它不会,并且编译器在这些情况下没有错。

如果你在编译时知道SIZE

int ar[SIZE];

如果您不这样做:

std::vector<int> ar;

我不想在您的C++代码中看到malloc。但是,您从根本上是正确的,对于 C,这正是您要做的:

int* ptr = malloc(sizeof(int) * SIZE);
/* ... */
free(ptr);

可变长度数组是 GCC 扩展,允许您执行以下操作:

int ar[n];

但是我遇到了禁用VLA的问题,但GCC没有成功检测到我正在尝试使用它们。混乱随之而来。只是避免它。

Q1 : 第一个定义是静态数组声明。完全正确。 这是当你有已知的大小时,所以没有与VLA或malloc((的比较。

Q2 : 当将大小作为用户的输入时,哪个更好:VLA 或 malloc 。

VLA :它们受到环境限制在自动大小上的限制 分配。并且自动变量通常分配在相对相对
的堆栈上 小。限制是特定于平台的。此外,这仅在 c99 及更高版本中。VLA 在声明多维数组时获得了一些易用性。

马洛克 :从堆中分配。所以,对于大尺寸肯定更好。对于多维数组指针,涉及有点复杂的实现。

检查 http://bytes.com/topic/c/answers/578354-vla-feature-c99-vs-malloc

我认为 metod1 可能会快一点,但它们在 C 中都是正确的。

在C++第一个将起作用,但如果你想使用第二个,你应该使用:

 int size = 5;
 int * array = new int[size];

并记得删除它:

 delete [] array;

我认为它为您提供了更多编码时使用的选择。

如果使用malloc或其他动态分配来获取指针。你会像 p+n...,但如果你使用数组,你可以使用 array[n] 。此外,在定义指针时,您需要释放它;但是数组不需要free.

在C++中,我们可以定义用户定义的类来做这些事情,而在STL中,有std::vector可以做数组的事情,等等。

两者都是正确的。 使用的声明取决于您的代码。

第一个声明,即 int a[size];创建一个固定大小为 20 个元素的数组。当您知道将在代码中使用的数组的确切大小时,这将很有帮助。例如,您正在生成一个数字的表n直到其第 20 个倍数。

第二个声明允许您创建所需大小的数组。当您需要不同大小的数组时,这很有帮助,例如,每次执行代码时,您都想生成斐波那契数列直到n。在这种情况下,必须为n的每个值n数组的大小。所以假设你有 n = 5 ,在这种情况下int a [20]会浪费内存,因为只有前五个插槽将用于斐波那契数列,其余的将是空的。同样,如果n = 25,则数组int a[20]将变得太小。

如果使用 malloc 定义数组,则区别在于,您可以动态传递数组的大小,即在运行时。输入程序在运行时具有的值。另一个区别是,使用 malloc 创建的数组在堆上分配空间。因此,与静态数组不同,它们在函数调用中保留。

例-

       #include<stdio.h>
       #include<stdlib.h>
       int main()
       {
           int n;
           int *a;
           scanf("%d",&n);
           a=(int *)malloc(n*sizeof(int));
           return 0;
       }