使用函数时发生cout错误

cout error while using functions

本文关键字:cout 错误 函数      更新时间:2023-10-16

我在尝试创建一个使用函数将十进制数转换为二进制数的代码时遇到了一个问题。起初,我只使用main函数创建了代码,它运行良好,但决定将其修改为use函数。我相信代码写对了,但是当我尝试cout时,我得到了一个像115120160758866453687091316369641637416这样的大数字。

这是代码

  #include <iostream>
    #include <math.h>
    using namespace std;
int* unsigned_dec(int dec_M) { //function for converting absolute part of          numbers
    int bin[8] = { 0,0,0,0,0,0,0,0 };
    int ind = 7;
    int arr_ind = 0;
    for (int base = (int)abs(dec_M); base > 0; base = base / 2) {
        if (base % 2 == 0) {
            bin[arr_ind] = 0;
            ind--;
        }
        else {
            bin[arr_ind] = 1;
            ind--;
        }
        arr_ind++;
    }
    return bin;
}

int main() {// main function
    int dec_N;
    cin >> dec_N;
    int* bin_main = unsigned_dec(dec_N); //we are not sure if we are     assigning the returned value of function to array in correct  
for (int i = 0; i <= 7; i++) {
        cout << bin_main[i];
}
cout << endl;
return 0;
}

然后我尝试将cout代码更改为

cout << bin_main[0] << bin_main[1] << bin_main[2] << bin_main[3] << bin_main[4] << bin_main[5] << bin_main[6] << bin_main[7] << endl;

这很好。然后我用另一种方式写了同样的cout的第二个变体

cout << bin_main[0];
cout << bin_main[1];
cout << bin_main[2];
cout << bin_main[3];
cout << bin_main[4];
cout << bin_main[5];
cout << bin_main[6];
cout << bin_main[7];
cout << endl;

并且我的代码开始CCD_ 3相同的奇怪数字。我认为couts的所有3种方式几乎相同(尤其是2和3),但不明白是什么导致它不起作用。

int bin[8] = { 0,0,0,0,0,0,0,0 };

在堆栈上分配。您应该在堆上分配bin

auto bin = std::unique_ptr<int, std::default_deleter<int[]>>(new int[8]);

或者更好,使用std::vector

您正在返回指向main中intbin[]的本地数组的指针。一旦调用cout中的另一个函数(即CCD_10运算符),函数unsigned_dec堆栈上的此数组将失效。

正如其他人已经提到的:函数永远不应该返回指向局部变量的指针。当函数返回时,局部变量无效。

一个更好的方法是使用向量,并使函数返回向量。

类似于:

#include <iostream>
#include <math.h>
using namespace std;
//function for converting absolute part of numbers
vector<int> unsigned_dec(int dec_M) {
    vector<int> bin;   // Create a vector
    bin.resize(8, 0);  // Fill it with 8 elements initialized to zero
    int arr_ind = 0;
    // Note: added check for arr_ind being valid
    for (int base = (int)abs(dec_M); base > 0 && arr_ind < 8; base = base / 2) {
        if (base % 2 == 0) {
            bin[arr_ind] = 0;
        }
        else {
            bin[arr_ind] = 1;
        }
        arr_ind++;
    }
    return bin; // Return the vector
}

int main() {
    int dec_N;
    cin >> dec_N;
    vector<int> bin_main = unsigned_dec(dec_N);
    for (int i = 0; i < bin_main.size(); i++) {
        cout << bin_main[i];
    }
    cout << endl;
    return 0;
}