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];