我有一个整数数组: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;
}发布于 2017-05-28 09:32:20
toBinary方法返回局部变量的地址。当函数退出时,byte将被删除。
事实上,您的第一个输出工作似乎只是运气,因为内存段没有任何其他使用在这一点上。
要解决这个问题,要么必须手动分配堆上的数组,要么使用其中一个容器(std::array,std::vector)。
发布于 2017-05-28 09:42:28
其他答案已经触及了这里的问题所在,我想强调的是,您的代码是反现代的C++,您确实应该使用std::vector (如果您有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;发布于 2017-05-28 09:34:08
通过toBinary,您将返回一个局部变量,该局部变量在函数调用结束后将被释放。必须使用堆为数组分配内存。然后返回该指针并将其收集到变量b中。
https://stackoverflow.com/questions/44225749
复制相似问题