我想创建一个可变长度的全局数组,这样我就可以在main((或任何函数中使用它们。
#include <iostream>
int g_t_step[];
int main()
{
g_t_step[1]=1;
std::cout << g_t_step[1];
}
通常,全局变量不是除日志记录之外的最佳选择。很容易弄不清楚哪个函数/方法将修改数组的内容,而且随着代码库的增长,很难进行调试。如果你提供更多关于你正在努力实现的目标的细节,就会更容易帮助你。
通过查看您的代码示例,我猜您对C++还很陌生,您编写的代码不会编译。您在这里定义的变量g_t_step
也应该初始化,例如:
int g_t_step[] = {1, 2, 3};
但是,如果您希望您的数组可以调整大小,则不能以这种方式声明它,因为无论您尝试做什么,g_t_step
的大小都是3(在我的示例中,因为左侧有3个数字(。原因是g_t_step
是在编译时定义的堆栈上分配的。
如果你希望它是可调整大小的,它应该像这样在堆上分配:
#include <iostream>
int* g_t_step = nullptr;
int size = 0;
int capacity = 0;
int main() {
g_t_step = new int[10]; // heap allocation
capacity = 10;
g_t_step[0] = 4 // initialize the second element of the array
size = 1;
std::cout << g_t_step[0] << 'n';
return 0;
}
这将是回答您的问题的方法,但它非常简单,您必须自己跟踪数组的当前大小和其中的元素数量。简单的方法是使用STL的std::vector模板,比如so:
#include <iostream>
#include <vector>
// the static part is not necessary if you only have one file
// but is usefull if you define g_t_step in another source file
// which is then linked against the main
static std::vector<int> g_t_step;
int main() {
g_t_step.push_back(1); // initialize the first value...
g_t_step.push_back(2); // second...
g_t_step.push_back(3); // and third...
std::cout
<< g_t_step.size() << ' ' // output 3 because the vector contains 3 numbers
<< g_t_step.capacity() << ' ' // output 4
<< g_t_step[0] << ' ' // output 1
<< g_t_step[1] << ' ' // output 2
<< g_t_step[2] << 'n'; // output 3
}
类std::vector跟踪元素的数量(size(((和数组的大小(capacity(((,数组的大小始终是元素数量(本例中为4(的2次方。
然后你可以写这样的东西:
static std::vector<int> vect;
void add_element(int e) {
vect.push_back(e);
}
int main() {
add_element(4);
add_element(5);
std::cout << vect[0] << ' ' << vect[1] << 'n'; // output: 4 5
}
但同样,这被认为是一种糟糕的做法,所以在没有更多细节的情况下,我不建议使用它,除非它是一个小脚本。
有关更多信息,请参阅:std::矢量
您还可以查看静态变量。
可变长度数组的概念适用于C99,但不适用于C++标准。在一种增强的方式中,您可以借助C++中的向量。它们能够调整大小并重新分配所需的内存以正确使用它们。
假设以下示例代码并注意注释:
#include <iostream>
#include <vector>
int main(void) {
// Example 1: Manually resizing the vector
// ---------------------------------------
std::vector<int> myVec;
int n = 100;
myVec.resize(n); // Similar work to that of VLAs
// Example 2: Dynamically managing the size of vector
// --------------------------------------------------
std::vector<int> myVec {10, 20, 30};
std::vector<int> myVec2;
myVec.push_back(10);
myVec.push_back(20);
// After this, the size of the vector will be increased by 2
// since two elements are inserted.
// You can erase() the vector elements and the sizes will be
// automatically reduced.
.
.
return 0;
}
另一方面,您不应该考虑全局声明变量。
您没有初始化数组大小。这将在编译时给你错误
当你写时
int a
则变量";a";存储在堆栈内存中,随机地址大小为int(取决于处理器(
但是当你写的时候
int a[]
那么堆栈内存需要在堆栈内部分配数组的大小例如CCD_ 4;这将导致堆栈内存中3*的大小(int的大小(
正如我上面讨论的,数组的静态分配直接存储在堆栈中但是您也可以在堆中分配数组,这称为动态分配。我认为你必须首先尝试自己的动态分配