为什么我不能使用函数调用来声明数组的长度?
Why can't I use a function call to declare the length of an array?
这就是我要做的:
const char wav_folder[] = ".\wav";
const char search_path[strlen(wav_folder) + 6];
但是字符串部分不允许我创建这个字符数组。这不是编译。为什么?
错误:
Error 1 error C2057: expected constant expression c:usershassandocumentscppdir_searchdir_searchdir_searchsource.cpp 15 1 dir_search
Error 2 error C2466: cannot allocate an array of constant size 0 c:usershassandocumentscppdir_searchdir_searchdir_searchsource.cpp 15 1 dir_search
Error 3 error C2734: 'search_path' : const object must be initialized if not extern c:usershassandocumentscppdir_searchdir_searchdir_searchsource.cpp 15 1 dir_search
Error 4 error C2133: 'search_path' : unknown size c:usershassandocumentscppdir_searchdir_searchdir_searchsource.cpp 15 1 dir_search
数组的大小是在编译时创建的。strlen()
和所有其他函数运行在运行时。
因此,当编译器在const char search_path
的最终可执行文件中分配空间时,它不知道字符串的长度。
你需要做以下其中一个:
-
使用
sizeof
,就像const char search_path[sizeof(wav_folder) + 6];
一样(谢谢,伙计们!我忘了…), -
手动插入
search_path.
的总长度。例如const char search_path[13];
, -
在运行时动态分配一个数组(使用
new
,当你完成它时,释放new
对应的delete
/delete[]
占用的内存, -
或
#define
为searchpath
所需的长度。宏在编译时被求值/替换。因此,您可以像这样定义必要的长度:#define SEARCH_PATH_LEN 13
如果你想动态分配一个数组,你应该使用new操作符new。这是"堆栈"分配-当你声明它时,你不能使用函数来确定它的大小。
编译器想要提前知道它的大小——把它放在堆栈上而不是堆上,当你使用函数的时候——它不能知道它的大小是多少(在函数被调用之前)。
原因完全由第一个错误文本拼写- "期望的常量表达式"
在C/c++中声明数组需要在[
和]
之间的常量表达式,即一个可以在编译时计算的表达式。strlen()
的结果在编译时不知道,所以它不能使用(因为它是运行时函数),但您可以用sizeof()
替换它:
const char search_path[sizeof(wav_folder) + 6];
EDIT(如下注释)如果数组在堆栈上分配,则不需要常量表达式,但问题中的数组在静态内存中分配,因此出现此错误。其他有用的细节在NathanOliver下面的评论
- 无法将字符串数组声明为类成员而不是字符 (C++)
- 为什么从函数返回数组时需要将数组声明为静态数组.(C++)
- 在 c++ 中直接访问的内联数组声明
- 由于 2D 数组声明,C++ 14 中的运行时错误
- 如何将char数组声明为函数参数?或告诉我此代码中还有其他问题?
- 来自函数参数的 C++ 静态数组声明
- C++ 中的动态数组声明
- C++数组声明
- 数组声明中的错误:表达式必须具有常量值
- 程序随数组声明崩溃
- 运行时和编译时的数组声明
- C++数组声明和初始化
- 带有常量表达式的数组声明
- C ,数组声明,模板,链接器错误
- 如何用'n'维数组声明 std::vector?
- 数组声明上的编译器错误
- 这是什么数组声明
- 头文件类中的数组声明
- 节点数组声明
- 在静态数组声明中使用了两次C++常量