定义数组 C/C++
Defining Array C/C++
这两个数组定义之间有什么区别,哪个更正确,为什么?
#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.h
和 array = 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;
}
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组的地址分配给变量并删除
- 从C++本机插件更新Vector3数组
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 数组索引的值没有增加
- 将对象数组的引用传递给函数
- 为char数组调整zlib-zpipe
- 2D数组来自文本输入,中间有空格
- std::向量与传递值的动态数组
- 在c++中用vector填充一个简单的动态数组
- 使用strcpy将char数组的元素复制到另一个数组
- 使用指针从C++中的数组中获取最大值
- C++使用整数的压缩数组初始化对象
- 告诉一个 const char 数组,除了编译时 C 样式的字符串外,它不以 '