在c ++中的二维数组中通过引用传递有问题

时间:2011-07-20 22:42:55

标签: c++

我有一个名为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函数中,元素的数量将被正确打印?

1 个答案:

答案 0 :(得分:7)

您的代码是C风格。如果您真的在编写C ++,那么我建议使用std::coutstd::vectorstd::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);
}