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

时间:2016-06-24 19:36:30

标签: c++ arrays char strlen

这就是我想要做的事情:

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

3 个答案:

答案 0 :(得分:6)

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

因此,编译器在const char search_path的最终可执行文件中分配空格时,不知道该字符串的长度。

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

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

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

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

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

答案 1 :(得分:2)

如果要动态分配数组,则应该使用new operator new。 这是“堆栈”分配 - 您在声明它时不能使用函数来确定大小。

编译器希望事先知道大小 - 将它放在堆栈而不是堆上,当你使用函数时 - 它无法分辨大小是什么(在函数被调用之前。< / p>

答案 2 :(得分:2)

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

C / C ++中的数组声明需要[]之间的常量表达式,即在编译时可以计算(计算)的表达式。 strlen()的结果在编译时是未知的,因此无法使用(因为它是运行时函数),但您可以将其替换为sizeof()

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

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