Почему вектор вызывает ошибку сегментации Ошибка? - PullRequest
1 голос
/ 08 ноября 2019

Я хотел сделать Случайное число из 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

Но я не хочу делать структуру. Просто используйте vector . Итак, я попытался.

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)

Вы можете увидеть журнал ошибок. Я искал разницу «резерв» с «изменить размер». Но эти функции вызвали ту же ошибку.

Почему это произошло ??

1 Ответ

5 голосов
/ 08 ноября 2019

Во-первых, это должно быть 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());
...