从函数传递到 main 时,C++ 如何处理向量?

How does C++ handle vectors when passing from a function to main?

我在生成整数的二进制表示的 'simple' 函数的输出中看到奇怪的行为。我的目标是在另一个代码中使用该函数,但首先想通过打印到控制台来查看它是否正常工作。我首先定义函数 dec2bin 以获取数字和所需位串的长度。定义函数将返回的向量后,向量将填充所需的二进制值。在 main 函数中,向量被访问并按元素打印到控制台。但是,除非我在填充 for 循环的向量中包含任意 cout 语句,否则输出不正确。

函数定义如下:

vector<int> dec2bin(int N, int j){
    vector<int> myvec;
    myvec.push_back(N);
    for (int i = N-1; i >= 0; i--) {
        int r = j >> i;
        if (r & 1)
            myvec[N-i-1] = 1;
        else 
            myvec[N-i-1] = 0;
        //cout << " ";
    }
    return myvec;
}

我的主要功能是:

int main(){
    int length = 8;
    int num = 15;
    vector<int> myvec = dec2bin(length,num);
    for (int j=0; j<length; j++){cout << myvec[j];}
    return 0;
}

当注释掉的行 (cout << " ") 包含在 for 循环中时,输出是正确的,带有 00001111。如果没有该行(或 for 循环外部的行),则输出不正确为 00001141130 .

我已经阅读了关于指针和内存分配的各种内容,所以我想这就是我出错的地方;但是,我不太明白如何将这些想法合并到我自己的代码中。非常感谢任何建议,非常感谢。

这一行:

myvec[N-i-1] = 1;

您正在为 0 以外的任何索引调用未定义的行为。

myvec.push_back(N); 将单个元素推入向量,而您永远不会向向量添加更多元素。当你越界访问一个向量时,你不会得到编译器错误或运行时异常,但你的代码有 undefined behavior,这意味着输出可以是任何东西。

实际上,您似乎只是将 push_back()resize() 混淆了。而不是 resize(),您可以将大小传递给构造函数。如果你替换:

vector<int> myvec;
myvec.push_back(N);

与:

std::vector<int> myvec(N);

或:

std::vector<int> myvec;
myvec.resize(N);

您得到一个包含 N 个元素的向量,访问 myvec[i] 对任何索引 0 <= i < N 都没有问题。或者,您可以调用 myvec.reserve(10) 让向量为 N 个元素分配 space。然后向量仍然是空的,你必须push_back()任何你想添加的元素。

您正在访问未分配的内存,因为您只推回 (push_back()) 一次,因此您会得到未定义的行为。 您应该使用 .at() 函数而不是 [] 运算符来访问向量元素,它会抛出异常。

您需要使用 push_back() 插入到向量中,或者您可以在向量声明期间使用 vector.resize(size),这样可以避免未定义的行为。

谢谢