为啥vector会导致Segmentation fault Error?
Posted
技术标签:
【中文标题】为啥vector会导致Segmentation fault Error?【英文标题】:Why vector cause Segmentation fault Error?为什么vector会导致Segmentation fault Error? 【发布时间】:2019-11-08 08:01:01 【问题描述】:我想从 Openssl 制作随机数。
所以。我做了程序:
#include "openssl/rand.h"
struct randomData
char str[32];
int main()
std::vector<randomData> vecStr;
randomData rd;
vecStr.emplace_back(rd);
RAND_bytes((unsigned char *)vecStr[i].str, sizeof(vecStr[i].str));
std::string ss = to_hex(vecStr[i].str, sizeof(vecStr[i].str));
std::cout << "Random Nonce Hex Data : " << ss << " // Key Length : " << ss.length()<<std::endl;
return 0;
// [out put]
// Random Nonce Hex Data : f0f5e38e596fdb2f7cef79d3706fcbf111decaa844154295b89b90eb65925a53 // Key Length : 64
但我不想制作结构。只需使用矢量。 所以,我试过了。
std::vector<char> str;
str.reserve(33);
RAND_bytes((unsigned char *)&str, sizeof(str));
std::string ss = to_hex((char*)&str, sizeof(str));
std::cout << "Random Nonce Hex Data : " << ss << " // Key Length : " << ss.length() << std::endl;
// [ output ]
// Random Nonce Hex Data : f1935de540b5a75bcaa9eab4b173abcb6a840bf83c4181ee // Key Length : 48
// Segmentation fault (core dumped)
您可以看到错误日志。 我用“resize”搜索了不同的“reserve”。但是这些功能导致了同样的错误。
为什么会这样??
【问题讨论】:
RAND_bytes
是什么?
如果你做这种类型转换(unsigned char *)
,你就做错了。
&str
应该是 &str[0]
或 str.data()
。您想要第一个元素/数据的地址而不是向量本身的地址。
@rveerd str.data() 没有导致段错误但输出错误...
【参考方案1】:
首先,应该是resize
,而不是reserve
。
其次,使用.data()
而不是转换为指针类型。
第三,是str.size()
,不是sizeof(str)
。
std::vector<char> str(33);
RAND_bytes(reinterpret_cast<unsigned char*>(str.data()), str.size());
std::string ss = to_hex(str.data(), str.size());
【讨论】:
以上是关于为啥vector会导致Segmentation fault Error?的主要内容,如果未能解决你的问题,请参考以下文章