调用一个两次引用数组的函数

时间:2016-01-15 14:50:56

标签: c++

我有一个将十进制整数转换为二进制的函数,并将结果存储在大小为32的char数组中(用零填充):

void ConvertToBinary(int DecimalNumber,char (&binNumber)[32])
{
    int dec = DecimalNumber;

    for(int pos = 31; pos >= 0; --pos)
    {
        binNumber[pos] = '0';
    }

    binNumber[32] = '\0';

    for(int pos = 31; pos >= 1; --pos)
    {
        if(dec % 2) {
            binNumber[pos] = '1';
        }
        dec = dec/2;
     }

}

但是,当我在两个不同的数组上调用该函数两次时,第一个数组将被删除:

int main()
{

    char binArray1[32],binArray2[32];
    int dec1 = 89789879;
    int dec2 = 80809765;
    ConvertToBinary(dec1,binArray1);
    printf("binArray1: %s\n",binArray1); //Correctly prints out the array.
    ConvertToBinary(dec2,binArray2);
    printf("binArray1: %s\n",binArray1); //Prints out nothing :(
    printf("binArray2: %s\n",binArray2); //Prints out binArray2


return 0;
}

在研究了这个问题之后,我认为这个问题与将数组的引用作为参数传递有关。但是我不清楚为什么这会导致binNumber1指向不同的地址。

有趣的是,我一直在Red Hat(x86)Linux机器上使用gcc 4.1.2版进行编译。当我在Visual Studio 2015上编译和运行时,我没有遇到这个问题。知道这里发生了什么吗?

提前致谢。

3 个答案:

答案 0 :(得分:5)

%s的{​​{1}}指令用于打印以空字符结尾的字符串。您的数组以null结尾,因此您不应使用printf输出它们。

相反,您可以在循环中打印它们:

%s

答案 1 :(得分:3)

binNumber[32] = '\0';

binNumber是一个包含32个char的数组。 binNumber[32]不是该数组的有效索引,因此对它的赋值会产生未定义的行为。要保存32个字符和终止零,数组的大小应为33。

答案 2 :(得分:0)

如果你知道你有32位数,在这种情况下,你可以使用

printf("binArray1: %.32s\n",binArray1);

仅打印前32个字符。