调用对数组引用两次的函数
Calling a function that takes a reference to an array twice
>我有一个函数,可以将十进制整数转换为二进制,并将结果存储在大小为 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 个字符。
相关文章:
- 从具有按值捕获的 lambda 移动构造 std::函数时,移动构造函数调用两次
- C++析构函数调用两次,堆栈分配的复合对象
- C++两次定义相同的函数会导致错误
- 对于优化级别为 0 的 std::vector,析构函数被调用两次
- 为什么转换运算符调用复制构造函数两次,而等效函数只调用它一次
- 调用一个小函数两次(例如在if条件和主体中)比将结果存储在局部变量中更可取
- 为什么这个自定义分配器的析构函数在 GCC/MSVS 的 stdlib 中被调用两次
- 调用某个回调函数两次会导致分段错误:Nan
- C++:链接库两次,全局构造函数运行两次吗?
- 执行函数两次
- 重载运算符 new(),为什么构造函数被调用两次?
- 带有文件结束函数的 while 循环重复输出文件中的最后一个数字两次
- 为同一存储位置调用构造函数两次是否合法?
- 为什么在下面的代码中调用复制构造函数两次
- 两个单链列表共享同一个节点和析构函数两次删除相同的内存
- 析构函数在 lambda 捕获说明符中声明的类实例上运行两次
- 为什么在这里调用析构函数两次
- while 循环在一个函数调用中执行两次
- 为什么这个构造函数被调用两次
- 用define替换两次函数调用