为啥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 *),你就做错了。 &amp;str 应该是 &amp;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?的主要内容,如果未能解决你的问题,请参考以下文章

为啥使用 STL std::vector 作为 __block 变量会导致内存损坏?

为啥无限递归会导致段错误

为啥增加递归深度会导致堆栈溢出错误?

为啥在 MySQL 查询中添加 '*' 会导致语法错误?

为啥使用更多线程会导致运行时间变慢?

为啥初始化列表中的元素数量会导致模棱两可的调用错误?