Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 定义数组C/C++;_C++_C_Arrays_C Preprocessor - Fatal编程技术网

C++ 定义数组C/C++;

C++ 定义数组C/C++;,c++,c,arrays,c-preprocessor,C++,C,Arrays,C Preprocessor,这两个数组定义之间的区别是什么?哪一个更正确?为什么 #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 d

这两个数组定义之间的区别是什么?哪一个更正确?为什么

#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;
}
#包括
#定义尺寸20
int main(){
//定义方法1:
int a[大小];
//结束定义方法1。
//定义方法2:
int n;
scanf(“%d”和“&n”);
int b[n];
//结束定义方法2。
返回0;
}

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

它不是“更正确”或者“不正确”。它不是<强> > xor >强>不是< /强>正确。特别是,这在C中工作,但在C++中没有。

你声明动态数组。更好的方法声明动态数组为

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

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

< P>(前C99)C和C++,所有类型都是静态大小的。这意味着数组必须声明为一个既恒定又已知的编译器大小。

现在,许多C++编译器提供动态大小的数组作为非标准扩展,C99明确允许它们。所以<代码> int b[n]如果您尝试它,它很可能会工作。但在某些情况下,它不会工作,而且编译器在这些情况下没有错误。

我认为metod1可能会快一点,但在C中这两个都是正确的

<> C++中的第一个将工作,但是如果你想使用第二个,你应该使用:

 int size = 5;
 int * array = new int[size];
记住删除它:

 delete [] array;

使用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;
       }
#包括
#包括
int main()
{
int n;
int*a;
scanf(“%d”和“&n”);
a=(int*)malloc(n*sizeof(int));
返回0;
}

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

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


和C++中,我们可以定义用户定义的类来做这些事情,在STL,有STD::vector做数组的事情,而且更多。< /P> < P>如果你知道编译时的<代码>大小<代码>:

int ar[SIZE];
如果您没有:

std::vector<int> ar;
可变长度数组是一个GCC扩展,允许您执行以下操作:

int ar[n];

但是我遇到了一些问题,VLA被禁用,但GCC没有成功检测到我试图使用它们。混乱随之而来。请避免它。

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

第一个声明,即
inta[size];
创建一个固定大小为20个元素的数组。 当您知道将在代码中使用的数组的确切大小时,这将非常有用 直到第20个倍数的数字表

第二个声明允许您创建所需大小的数组。
当您需要一个大小不同的数组时,它会很有用。例如,每次执行代码时,您都希望生成fibonacci序列,直到
n
。在这种情况下,数组的大小对于
n
的每个值都必须是
n
。因此假设您有
n=5
,在这种情况下
int a[20]
将浪费内存,因为只有前五个插槽将用于fibonacci系列,其余插槽将为空。类似地,如果
n=25
,则数组
int a[20]
将变得太小。

Q1:第一个定义是静态数组声明。完全正确。 这是当您知道大小时,因此无法与VLA或malloc()进行比较

问题2:将大小作为用户输入时,哪个更好:VLA还是malloc

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

Malloc:从堆中分配。因此,对于较大的大小肯定更好。对于,涉及多维数组指针,所以实现有点复杂


选中

Ok,但在C中使用哪一个是正确的?或者在这种情况下这并不重要?@DragosRizescu如果只在本地使用数组,那么就没有理由使用
malloc(),所以我更喜欢VLA方法。如果你需要从函数返回它,那么你不能使用本地数组,因为它在返回时被破坏了,所以你需要<代码> MalCube()/Cube >。但是C++中,你也没有真正使用<代码> MalCube()/代码>。<代码> STD::向量< />代码,或者至多<代码>新[]。
。此外,我认为在这种特殊情况下没有理由使用
malloc()<代码> >仅在函数中使用。变量@ @ H2CO3;谢谢在C++中纠正我关于代码> MalOC/<代码>。但是VLAs只允许在C99中使用,这就是为什么我认为“代码> MalOC 更好。我想知道为什么人们在投票后避免对帖子发表评论。@ H2CO3;谢谢:)每个星期我都会看到C的问题。莱明认为VLAs不起作用(因为他们没有在C99模式下编译他们的程序)或者这是什么类型的(不知道VLAs)。:)因为“这个广泛可用的标准功能在双重过时的C版本中不起作用,因此使用复杂的非本机解决方案更好”是错误的
int ar[n];