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

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];

但是 strlen 部分不允许我创建这个字符数组。这不是编译。为什么?

错误:

Error   1   error C2057: expected constant expression   c:\users\hassan\documents\cpp\dir_search\dir_search\dir_search\source.cpp   15  1   dir_search
Error   2   error C2466: cannot allocate an array of constant size 0    c:\users\hassan\documents\cpp\dir_search\dir_search\dir_search\source.cpp   15  1   dir_search
Error   3   error C2734: 'search_path' : const object must be initialized if not extern c:\users\hassan\documents\cpp\dir_search\dir_search\dir_search\source.cpp   15  1   dir_search
Error   4   error C2133: 'search_path' : unknown size   c:\users\hassan\documents\cpp\dir_search\dir_search\dir_search\source.cpp   15  1   dir_search

如果你想动态分配一个数组,你应该new operator new。 这是 "stack" 分配 - 您不能在声明时使用函数来确定大小。

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

数组的大小是在编译时创建的。 strlen() 和所有其他功能 运行 在 运行 时间 .

因此,编译器在为 const char search_path.

的最终可执行文件分配 space 时不知道字符串的长度

您需要执行以下操作之一:

  • 使用 sizeof,如 const char search_path[sizeof(wav_folder) + 6];(谢谢,伙计们!我忘记了......),

  • 手动插入search_path.的总长度 例如,
    const char search_path[13];,

  • 在运行时间动态分配一个数组(使用new,当你完成它时,释放它占用的内存new' s对应 delete / delete[],

  • #define searchpath 的必要长度。宏在编译时是 evaluated/substituted。因此,您可以像这样定义必要的长度:
    #define SEARCH_PATH_LEN 13

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

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

替换它

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

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