我有一个整数数组:int* b
,其值为元素0到7设置。当我单独打印每个元素时,我得到正确的元素。但是,当我使用for循环时,我会得到不同的结果。知道为什么吗?
以下是代码:
//toBinary(int x) returns an int pointer whose value is an array of size 8: int ret[8]
int* b = toBinary(55);
//Print method 1 (Individual printout)
cout << b[0] << b[1] << b[2] << b[3] << b[4] << b[5] << b[6] << b[7] << endl;
//Print method 2 (for loop)
for (int t = 0; t < 8; t++)
cout << b[t];
cout << endl;
首次打印的结果如下:00110111
这是正确的打印输出。
当我使用第二种技术进行打印时,它说-858993460-85899346051202679591765470927361022170810222364
打印输出错误。
为什么我会收到两种不同的打印输出?
这是toBinary方法:
int* toBinary(int i) {
int byte[8];
for (int bit = 7; bit >= 0; bit--) {
if (i - pow(2, bit) >= 0) {
byte[7-bit] = 1;
i -= pow(2, bit);
}
else
byte[7-bit] = 0;
}
return byte;
}
答案 0 :(得分:7)
toBinary
方法返回局部变量的地址。函数退出时将删除byte
。
你的第一个输出工作的事实似乎只是运气,因为此时其他任何东西都没有使用内存段。
要解决此问题,您必须手动在堆上分配数组,或者使用其中一个容器(std::array
,std::vector
)。
答案 1 :(得分:4)
其他答案已经触及了这里的问题,我想强调你的代码是反现代的C ++,你应该真的使用std::vector
(或std::array
如果你有C ++ 11)它将立即解决所有这些问题:
#include <vector>
std::vector<int> toBinary(int i) {
std::vector<int> byte(8);
for (int bit = 7; bit >= 0; bit--) {
if (i - pow(2, bit) >= 0) {
byte[7-bit] = 1;
i -= pow(2, bit);
}
else
byte[7-bit] = 0;
}
return byte;
}
然后..
std::vector<int> b = toBinary(55);
//Print method 1 (Individual printout)
cout << b[0] << b[1] << b[2] << b[3] << b[4] << b[5] << b[6] << b[7] << endl;
//Print method 2 (for loop)
for (int t = 0; t < 8; t++)
cout << b[t];
cout << endl;
答案 2 :(得分:3)
通过toBinary,您将返回一个局部变量,一旦函数调用结束,该变量就会被释放。您必须使用堆为阵列分配内存。然后返回该指针并将其收集在变量b中。