为什么我不能使用函数调用来声明数组的长度?
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 评论中
这就是我想要做的:
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
.
您需要执行以下操作之一:
使用
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 评论中