打印整数指针元素的不同结果

时间:2017-05-28 09:28:21

标签: c++ arrays

我有一个整数数组: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;
}

3 个答案:

答案 0 :(得分:7)

toBinary方法返回局部变量的地址。函数退出时将删除byte

你的第一个输出工作的事实似乎只是运气,因为此时其他任何东西都没有使用内存段。

要解决此问题,您必须手动在堆上分配数组,或者使用其中一个容器(std::arraystd::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中。