C++ 动态声明数组后面的静态声明
我想在一个函数中有一个数组,当我退出函数时,它会保留它的值,例如-C++ 动态声明数组后面的静态声明,c++,static,new-operator,C++,Static,New Operator,我想在一个函数中有一个数组,当我退出函数时,它会保留它的值,例如- int func(int x) { static int arr[5]; } 但问题是我事先不知道数组的大小(即它取决于x)。因此,我必须使用“new”声明一个数组 可以这样做吗 static int *arr=new int[x]; 或者我必须做: static int *static arr = new int[x] 如果没有,那么 怎么做?我认为这不合法。 可以使用变量在函数范围内“动态”调整数组大
int func(int x)
{
static int arr[5];
}
但问题是我事先不知道数组的大小(即它取决于x)。因此,我必须使用“new”声明一个数组
可以这样做吗
static int *arr=new int[x];
或者我必须做:
static int *static arr = new int[x]
如果没有,那么
怎么做?我认为这不合法。
可以使用变量在函数范围内“动态”调整数组大小的原因是因为数组被放在堆栈上:
void foo(int x)
{
int bar[x]; // this is legal
} // but goes out-of-scope here :-(
声明数组static
会破坏此功能。可以这样想:链接器没有机会知道数组的大小,因此无法定位“超出”数组的任何内容(显然不可取)
因此,基本上您需要通过
new
和delete
使用堆。或者更好地使用前面建议的std::vector
(在内部使用heap)。static int*arr=new int[x]代码>正常。但是,您需要担心内存泄漏,因为delete[]arr代码>
如注释中所述,本地静态std::vector arr
是首选,因为它的析构函数在程序结束时自动调用。首选使用静态std::vector
。使用静态std::vector
。这看起来很尴尬,因为x在不同的调用中可能有不同的值。如果第一次调用时x为1,而您分配了一个包含1个元素的数组,那么下次x为2会怎么样?@timrau…如果arr不是静态的,那么一旦我们退出函数,它就会被销毁…那么我们将如何访问数组元素?@avinash不可能。因此,您应该找到一些方法让调用者访问地址,例如returnarr
,将其分配给int**
参数,或者甚至将其分配给全局int*
(尽管是最糟糕的方式)代码>这是非法的,因为代码GX*X/Cube不是在编译时决定的,尽管GCC扩展允许它。Hmm,它可能在C++中是非法的吗?它在C(C99)中是允许的。