2012-05-08 1 views
1

Если у меня есть std :: vector буфер, в котором есть место для 100 символов, и я вызываю функцию C, которая будет писать строку с нулевым завершением, такую ​​как writestring(&buffer[0], buffer.size()), из того, что я «Я читал, что все нормально, если в буфере уже есть данные. Но если вектор пуст, поведение не определено. Как мне обойти это, могу ли я написать что-то в буфер, например «qwerty», а затем вызвать функцию writeestring(), чтобы я знал, что поведение всегда определено? Какое хранилище вы используете при вызове функций C? Я просто читал о .data, но я не знаю, насколько это распространено или портативно.Вызов функции C с адресом на пустой std :: vector

Благодаря

+0

Если вы не будете динамически распределять свой буфер до того размера, который заранее неизвестен заранее, то нет большого выигрыша в использовании вектора над простым массивом. –

+3

@CrazyEddie - Я не согласен. С 'std :: vector' (или' std :: array') вы получаете [семантику значений] (http://en.wikipedia.org/wiki/Value_semantics). Я нахожу, что это уменьшает ошибки в клочьях до такой степени, что я * никогда * не использую голые массивы или голые указатели для первых членов. –

+0

Вы можете не согласиться с тем, что хотите, пока осознаете, что ошибаетесь. –

ответ

3

C++

std::vector<char> v; 
v.resize(100); 
writestring(&v[0], v.size()); 

C

void writestring(char*p, size_t len) { 
    strncpy(p, "Doofi", len); 
} 

если вектор пуст поведение не определено. Как мне обойти это?

Передача непустого буфера. Используйте метод .resize(), чтобы быстро заполнить вектор или построить его в правильном размере: std::vector<int> v(100);.

Какое хранилище вы используете при вызове функций C?

std::vector - прекрасный выбор для этого приложения. В C он выглядит так же, как массив или область malloc'd. Но, поймите, что указатель C действителен только до тех пор, пока вектор не перераспределяется и не уничтожается.

+0

Хорошо проверите это, я просто прочитал http://stackoverflow.com/questions/3829788/using-operator-on-empty-stdvector. Ты согласен или несогласен? Даже если я изменяю размер вектора, он еще не пуст и не является пустым поведением неопределенным? – loop

+0

Буфер, который является 'resize'd, к ненулевому значению, не является пустым и принимает адрес первого элемента. Буфер, который является 'resize'd до нулевых элементов, пуст; Принимая адрес первого элемента, это неопределенное поведение. Пока '100'! =' 0', приведенный выше код является корректным. (Да, я согласен с заключением упомянутого вопроса: вы не должны брать адрес первого элемента пустого вектора.) –

+0

Хорошо спасибо. – loop

3

Изменение размера вектора первого:

buffer.resize(100); 
writestring(buffer.data(), buffer.size()); // buffer.data() == &buffer[0] 

Альтернативно, построить буфер нужного размера за один раз:

std::vector<char> buffer(100); 
0

Я думаю, вы должны проверить, что буфер не пуст. Если он пуст, не вызывайте writestring.

Смежные вопросы