调用对数组引用两次的函数



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

void ConvertToBinary(int DecimalNumber,char (&binNumber)[32])
{
    int dec = DecimalNumber;
    for(int pos = 31; pos >= 0; --pos)
    {
        binNumber[pos] = '0';
    }
    binNumber[32] = '';
    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: %sn",binArray1); //Correctly prints out the array.
    ConvertToBinary(dec2,binArray2);
    printf("binArray1: %sn",binArray1); //Prints out nothing :(
    printf("binArray2: %sn",binArray2); //Prints out binArray2

return 0;
}

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

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

提前谢谢。

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

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

for (auto c : binArray1) std::cout << c;
binNumber[32] = '';

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

如果您知道自己有 32 位数字(在本例中为),则可以使用

printf("binArray1: %.32sn",binArray1);

仅打印前 32 个字符。

最新更新