1

writestring(&buffer[0], buffer.size())100文字のスペースがあるstd::vectorバッファがあり、バッファにすでにデータがある場合は、読んだもののようにNULLで終了する文字列を書き込むC関数を呼び出す場合は問題ありません。ただし、ベクトルが空の場合、動作は定義されていません。これを回避するにはどうすればよいですか。「qwerty」のようなものをバッファに書き込んでから、writestring()を呼び出して、動作が常に定義されていることを確認できますか?C関数を呼び出すときにどのようなストレージを使用しますか?.dataについて読んだばかりですが、それがどれほど一般的で移植性があるのか​​わかりません。

ありがとう

4

3 に答える 3

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された領域のように見えます。ただし、Cのポインタは、ベクトルが再割り当てまたは破棄されていない場合にのみ有効であることに注意してください。

于 2012-05-08T20:08:51.310 に答える
3

最初にベクトルのサイズを変更します。

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

または、必要なサイズのバッファーを一度に作成します。

std::vector<char> buffer(100);
于 2012-05-08T20:10:04.583 に答える
0

バッファが空でないことをテストする必要があると思います。空の場合は、writestringを呼び出さないでください。

于 2012-05-08T21:10:43.277 に答える