为什么我不能使用函数调用来声明数组的长度?

Why can't I use a function call to declare the length of an array?

本文关键字:数组 声明 不能 函数调用 为什么      更新时间:2023-10-16

这就是我要做的:

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[]占用的内存,

  • #definesearchpath所需的长度。宏在编译时被求值/替换。因此,您可以像这样定义必要的长度:
    #define SEARCH_PATH_LEN 13

如果你想动态分配一个数组,你应该使用new操作符new。这是"堆栈"分配-当你声明它时,你不能使用函数来确定它的大小。

编译器想要提前知道它的大小——把它放在堆栈上而不是堆上,当你使用函数的时候——它不能知道它的大小是多少(在函数被调用之前)。

原因完全由第一个错误文本拼写- "期望的常量表达式"

在C/c++中声明数组需要[]之间的常量表达式,即一个可以在编译时计算的表达式。strlen()的结果在编译时不知道,所以它不能使用(因为它是运行时函数),但您可以用sizeof()替换它:

const char search_path[sizeof(wav_folder) + 6];

EDIT(如下注释)如果数组在堆栈上分配,则不需要常量表达式,但问题中的数组在静态内存中分配,因此出现此错误。其他有用的细节在NathanOliver下面的评论