默认情况下C ++数组作为参数引用?

时间:2018-03-24 22:58:09

标签: c++ arrays

请原谅我提出这么简单的问题,但是我无法连接SO或其他网站上之前答案中的点。我已经读过默认情况下数组是通过引用传递的,而其他地方我已经读过,数组在传递给函数时会衰减为指针。我试图将数组传递给函数并修改它,但无法协调前两个语句。我不确定我是否传递指针或引用toBin以及它是否重要。以下代码是我尝试更改b函数中的toBin数组。

当我打印修改后的数组时,我得到了一大堆意外文本,比原始分配的大小为11的数组大得多,例如1000000000 submarine blahblahblah。我的预期输出为1000000000

void toBin(int x,char a[]){ //passed by reference by default
    std::cout << a << std::endl;
    for (int i=9;i>=0;i--){
        if(pow(2,i)<=x){
            x=x-pow(2,i);
            a[9-i]='1'; //i-1 because char b[] is zero indexed
        };
    }
}
int main()
{
    char c[]="submarine";
    double combination = pow(2,sizeof(c)-1);
    char b[11]={'0','0','0','0','0','0','0','0','0','0'};
    toBin(512, b);
    for (int i=0;i<combination;i++){
        std::cout << *(b+i) << std::endl;
    }
}

1 个答案:

答案 0 :(得分:0)

基本上你把所有东西都传递给了函数。这打破了你的输出它循环本身。

double combination = pow(2,sizeof(c)-1);
...

for (int i=0;i<combination;i++){
    std::cout << *(b+i) << std::endl;
}

您的combination变量的值可能为2 ^ 8。因此,您将*(b+i)指向远远超出分配数组的地址。要修复它,您需要将循环更改为:

for (int i=0;i< sizeof(b);i++){