我有一个名为names
的变量,它是一个二维数组。
我在下面声明它,以便最多有5个名字,每个名字将由256个字符组成。
int main(){
char names[5][256];
strcpy(names[0],"John");
strcpy(names[1],"Matt");
printf("%d\n",sizeof(names)/256); //this prints out 5 which is correct
passit(names);
}
void passit(char names[][256]){
printf("%d\n",sizeof(names)/256); //this prints out 8 which seems to be a size of pointer
}
我应该如何改变这一点,以便在passit
函数中,元素的数量将被正确打印?
答案 0 :(得分:7)
您的代码是C风格。如果您真的在编写C ++,那么我建议使用std::cout
,std::vector
和std::string
:
void passit(std::vector<std::string> const& names) {
std::cout << names.size();
}
int main() {
std::vector<std::string> names(5);
names[0] = "John";
names[1] = "Matt";
std::cout << names.size();
passit(names);
}
否则,您可以对现有代码执行中间修复。
正如您所发现的那样,当您尝试按值传递数组时,它实际上会衰减为指针(在这种情况下为char(*)[256]
)并且您将丢失有关第一维尺寸的所有信息。
通过引用传递数组避免了这种情况,除了您现在必须指定包括所有数组维度的完整数组类型;模板参数推导然后使其自动:
template <size_t N>
void passit(char (&names)[N][256]) {
printf("%d\n", N);
}