如何解决从函数传递到 main 时,C++ 如何处理向量?
我在生成整数二进制表示的“简单”函数的输出中看到了奇怪的行为。我打算在另一个代码中使用该函数,但首先希望通过打印到控制台来查看它的工作情况。我首先定义函数 dec2bin 以获取一个数字和所需位串的长度。定义函数返回的向量后,向量将填充所需的二进制值。在主函数中,向量被访问并按元素打印到控制台。但是,除非我在填充 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
我已经阅读了关于指针和内存分配的各种内容,所以预计这就是我出错的地方;但是,我不太明白如何将这些想法融入我自己的代码中。任何建议将不胜感激,非常感谢。
解决方法
在这一行:
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
元素分配空间。然后该向量仍为空,您必须push_back()
要添加的任何元素。
您正在访问未分配的内存,因为您只推回 (push_back()
) 一次,因此您会遇到未定义的行为。
您应该使用 .at()
函数而不是 []
运算符来访问向量元素,它会抛出超出范围的异常。
您需要使用 push_back()
插入到向量中,或者您可以在向量声明期间使用 vector.resize(size)
,然后它会避免未定义的行为。
谢谢
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。