使用非常量函数参数初始化数组
Initialize array with a non-const function argument
有什么方法可以用非常量整数初始化数组,或者使现有变量常量以使其成为有效参数?
bool f( const char s[], const int n )
{
char c[n]; // error: expression must have a constant value
}
不,一般情况下不会。请改用 vector<char> c(n)
。
简单的、几乎正确的解释:如果你在编译时不知道 n
是什么,编译器也不知道。所以它不能为数组预留内存。这就是 vector
存在的原因。
如果您在其他地方需要它,您可以随时使用 &c[0]
获取指向 char 的指针。
但是 it is possible in C99, apparently. Thanks to @Matt McNabb 指出了这一点。如果你能等几年,你也许也能用 C++ 编译它。同时,使用 vector
.
如果你坚持在C++中有一个"array",你将不得不做类似的事情:
char* c = new char[n];
如果您的程序不会永远运行,或者经常这样做,您甚至可以保持原样而不用删除。像 Valgrind 这样的工具可能会抱怨。
根据 n
的来源,答案可能是否定的。如果 n
可以是 constexpr
,那么答案是肯定的。
有关 constexpr 的更多信息,请参阅此 SO post:When should you use constexpr capability in C++11?
n
位于堆栈上。在这种情况下,编译器需要在编译时知道 n
的大小。
可以通过运算符new
动态分配内存,或者使用std::vector
.
有什么方法可以用非常量整数初始化数组,或者使现有变量常量以使其成为有效参数?
bool f( const char s[], const int n )
{
char c[n]; // error: expression must have a constant value
}
不,一般情况下不会。请改用 vector<char> c(n)
。
简单的、几乎正确的解释:如果你在编译时不知道 n
是什么,编译器也不知道。所以它不能为数组预留内存。这就是 vector
存在的原因。
如果您在其他地方需要它,您可以随时使用 &c[0]
获取指向 char 的指针。
但是 it is possible in C99, apparently. Thanks to @Matt McNabb 指出了这一点。如果你能等几年,你也许也能用 C++ 编译它。同时,使用 vector
.
如果你坚持在C++中有一个"array",你将不得不做类似的事情:
char* c = new char[n];
如果您的程序不会永远运行,或者经常这样做,您甚至可以保持原样而不用删除。像 Valgrind 这样的工具可能会抱怨。
根据 n
的来源,答案可能是否定的。如果 n
可以是 constexpr
,那么答案是肯定的。
有关 constexpr 的更多信息,请参阅此 SO post:When should you use constexpr capability in C++11?
n
位于堆栈上。在这种情况下,编译器需要在编译时知道 n
的大小。
可以通过运算符new
动态分配内存,或者使用std::vector
.