Как передать вектор <unsigned char> в char *
У меня есть такой буфер:
vector<unsigned char> buf
Как я могу применить его к char *?
Если я это сделаю:
(char *)buf
Я получаю эту ошибку:
/home/richard/Desktop/richard/client/src/main.cc:102: error: invalid cast from type ‘std::vector<unsigned char, std::allocator<unsigned char> >’ to type ‘char*’
Для тех, кто задается вопросом, почему я пытаюсь это сделать. Мне нужно передать буфер этой функции:
n_sent = sendto(sk,(char *)buf,(int)size,0,(struct sockaddr*) &server,sizeof(server));
И он принимает только char *.
Ответы
Ответ 1
reinterpret_cast<char*> (&buf[0]);
Вектор гарантирует, что его элементы занимают непрерывную память. Таким образом, "данные", которые вы ищете, на самом деле являются адресом первого элемента (остерегайтесь vector <bool>
, этот трюк с ним не удастся). Кроме того, почему ваш буфер vector<char>
не нужен, так что вам не нужно reinterpret_cast?
Обновление для С++ 11
reinterpret_cast<char*>(buf.data());
Ответ 2
reinterpret_cast<char*>(buf.data());
Ответ 3
Try
(char *)(&buf[0])
или другой, больше С++. Но также расскажите нам, для чего вы это используете. Это может быть плохая идея.
Ответ 4
Очень маловероятно, что вы хотите отбрасывать vector<unsigned char>
в unsigned char *
, но вы можете получить допустимый указатель следующим образом:
vector<unsigned char> v;
unsigned char *p = &*v.begin();
Это странное выражение даст вам указатель на начало внутреннего выделенного массива, созданного вектором. Если вы измените вектор вообще, он может быть недействительным.
Причиной избыточного поиска &*
является то, что *
действительно operator *
на итераторе, возвращаемом v.begin()
. Это возвращает ссылку на первый char массива, который затем можно взять с адресом &
.