9

std::vector は連続しているため、出力配列を期待する C API に std::vector を渡すことは C++ で明確に定義されています。

std::vector<char> myArray(arraySize);
cStyleAPI(&myArray[0], arraySize);

同じ方法で std::string を C API に渡しても安全ですか? std::string が連続しており、この状況で std::vector と同じように機能するという標準 C++03 の保証はありますか?

4

5 に答える 5

11

C API 関数が の内容への読み取り専用アクセスを必要とする場合は、メンバー関数をstd::string使用して文字列を渡します。std::string::c_str()これは、null で終了する文字列であることが保証されています。

をoutstd::stringパラメーターとして使用する場合、C++03 は、格納された文字列がメモリ内で連続していることを保証しませんが、C++11 は保証します。後者の場合、終端の NULL 文字を変更しない限り、文字列を変更しても問題ありません。operator[]

于 2013-05-07T17:46:56.533 に答える
1

はい。ただし、 null 終了を保証するには、 c_strメソッドを使用してそれらを渡す必要があります。

于 2013-05-07T18:05:09.860 に答える
0

いいえ、そうではありませんが、一般的に、C 文字列はゼロで終わると想定されているため、ポインタへのポインタcharはそうではありません。( を使用する場合は、代わりにstring使用できます。これは 0 で終了します。)string::c_str()

とにかく、C++11 では の要素がvectorメモリ内で連続している必要があります。

于 2013-05-07T17:47:51.427 に答える
0
cStyleAPI(&myArray[0], arraySize);

cStyleAPI入力用に char* を受け取った場合、それstd::string::c_str()が目的です。

出力用に事前に割り当てられた char* を受け取った場合、no . その場合、std::vector<char>またはを使用する必要がありますstd::array<char>

于 2013-05-07T18:07:33.253 に答える