Подтвердить что ты не робот

Как передать вектор <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 *.

4b9b3361

Ответ 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 массива, который затем можно взять с адресом &.