std :: copyの間違った使用?

rightaway717

これは私が直面した問題を説明する簡単なテストプログラムです:

#include <iostream>
#include <stdlib.h>
#include <inttypes.h>
#include <vector>

using namespace std;
typedef unsigned char Byte;

int main( )
{
    uint32_t ui32 = 12;
    size_t sizeofUi32 = sizeof ui32;
    cout << "sizeofUi32: " << sizeofUi32 << endl;
    vector<Byte> v(10);
    std::copy(&ui32, &ui32 + sizeof ui32, &v[4]);

    uint32_t result = 0;
    std::copy(&v[4], &v[4] + sizeof ui32, &result);

    cout << "Result: " << result << " sizeofUi32: " << sizeofUi32 << endl;

    return 0;
}

出力:

sizeofUi32: 4    
Result: 12 sizeofUi32: 17179869184

この問題は、ポインタではなくイテレータを受け入れるstd :: copyが原因である可能性があると思いましたが、ここでSO取得したものからです

ポインタはイテレータです

したがって、サンプルコードには、欠落している単純な問題があるはずです。しかし、私はそれを見つけることができません。ここで何が問題なのか説明してもらえますか?

編集1:

したがって、回答から、バイトのベクトルを逆シリアル化するために、ベクトルに格納されているデータの正しい順序とタイプがわかっている場合は、std :: copyの使用を避け、適切なタイプの変数にベクトル値を割り当てることができるという考えが得られました。動作しますが、安全ですか?

uint32_t a = v[4];
uint8_t b = v[8];
user743382

差し迫った問題はここにあります:

std::copy(&ui32, &ui32 + sizeof ui32, &v[4]);
                       ^^^^^^^^^^^^^

&ui32タイプがありuint32_t *、それに何かを追加すると、オブジェクトのサイズがすでに考慮されます。sizeof ui32 uint32_tオブジェクトを効果的にコピーしようとしていますが、オブジェクトは1つしかないため、を使用する必要があります+ 1

それはさておき、std::copyさまざまなタイプのポインターを使用しても、期待した結果が得られない可能性があります。の効果がありv[4] = ui32;ここにあるの範囲ui32内にある限り機能しByteますが、一般的に信頼できるものではありません。

2つ目std::copyはほぼ同じ問題ですが、方向が逆です。

あなたにできることは:

std::copy((Byte*) &ui32, (Byte*) (&ui32 + 1), &v[4]);
// or std::copy((Byte*) &ui32, (Byte*) &ui32 + sizeof ui32, &v[4]);
...
std::copy(&v[4], &v[4] + sizeof ui32, (Byte*) &result);

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

std :: copyの間違った使用?

分類Dev

Valgrindを使用したlongdoubleのstd :: fpclassifyの結果が間違っています

分類Dev

整数配列で、stoulを使用したstd :: stringの出力が間違っています

分類Dev

逆イテレータを使用したstd :: vectorのstd :: lower_boundは、間違った結果を生成します

分類Dev

間違った入力の後にstd :: cin.clear()を設定してstd :: cinを使用できないのはなぜですか?

分類Dev

std :: get_time:間違った結果を使用してtime-stringをstd :: time_tに変換します

分類Dev

名前空間の使用の違い(std :: vs :: std::)

分類Dev

.std()と.skew()が.rollingで間違った答えを出す

分類Dev

std :: mapが間違ったキーを上書きする

分類Dev

std :: nth_elementが間違った値を提供する

分類Dev

std :: mapは間違った要素を消去します

分類Dev

std :: vectorの最初の要素の値が間違っています

分類Dev

std :: accumulate関数がvector <double>の間違った合計を表示するのはなぜですか?

分類Dev

std :: includeのバグですか、それとも何か間違ったことをしていますか?

分類Dev

間違ったパラメータでstd :: bindを正常に実行できるのはなぜですか?

分類Dev

`std :: copy()`と `std :: back_inserter()`の使用

分類Dev

std :: uninitialized_copyとstd :: copyの違いは?

分類Dev

C ++ std :: tmは、std :: chrono :: time_pointから変換した後、間違った値を返します

分類Dev

std :: ostringstreamは間違った場所にサインを入れますか?

分類Dev

std :: maperase-イテレータを間違ったマップに渡す

分類Dev

間違った入力に対するstd :: cin無限ループ

分類Dev

memsetの間違った使用?

分類Dev

std :: mapの反復が最初の実行で間違ってしまう

分類Dev

`std :: sin`は最後のビットで間違っています

分類Dev

std :: thread関数によって渡された間違ったデータを表示しています。

分類Dev

std :: eraseを正常に使用したメソッドを終了した後に間違った要素が削除されます

分類Dev

std :: bindとstd :: visitの使用

分類Dev

std :: is_copy_constructable for std :: vector

分類Dev

std :: filesystem :: copy()とstd :: filesystem :: copy_file()の違いは何ですか?

Related 関連記事

  1. 1

    std :: copyの間違った使用?

  2. 2

    Valgrindを使用したlongdoubleのstd :: fpclassifyの結果が間違っています

  3. 3

    整数配列で、stoulを使用したstd :: stringの出力が間違っています

  4. 4

    逆イテレータを使用したstd :: vectorのstd :: lower_boundは、間違った結果を生成します

  5. 5

    間違った入力の後にstd :: cin.clear()を設定してstd :: cinを使用できないのはなぜですか?

  6. 6

    std :: get_time:間違った結果を使用してtime-stringをstd :: time_tに変換します

  7. 7

    名前空間の使用の違い(std :: vs :: std::)

  8. 8

    .std()と.skew()が.rollingで間違った答えを出す

  9. 9

    std :: mapが間違ったキーを上書きする

  10. 10

    std :: nth_elementが間違った値を提供する

  11. 11

    std :: mapは間違った要素を消去します

  12. 12

    std :: vectorの最初の要素の値が間違っています

  13. 13

    std :: accumulate関数がvector <double>の間違った合計を表示するのはなぜですか?

  14. 14

    std :: includeのバグですか、それとも何か間違ったことをしていますか?

  15. 15

    間違ったパラメータでstd :: bindを正常に実行できるのはなぜですか?

  16. 16

    `std :: copy()`と `std :: back_inserter()`の使用

  17. 17

    std :: uninitialized_copyとstd :: copyの違いは?

  18. 18

    C ++ std :: tmは、std :: chrono :: time_pointから変換した後、間違った値を返します

  19. 19

    std :: ostringstreamは間違った場所にサインを入れますか?

  20. 20

    std :: maperase-イテレータを間違ったマップに渡す

  21. 21

    間違った入力に対するstd :: cin無限ループ

  22. 22

    memsetの間違った使用?

  23. 23

    std :: mapの反復が最初の実行で間違ってしまう

  24. 24

    `std :: sin`は最後のビットで間違っています

  25. 25

    std :: thread関数によって渡された間違ったデータを表示しています。

  26. 26

    std :: eraseを正常に使用したメソッドを終了した後に間違った要素が削除されます

  27. 27

    std :: bindとstd :: visitの使用

  28. 28

    std :: is_copy_constructable for std :: vector

  29. 29

    std :: filesystem :: copy()とstd :: filesystem :: copy_file()の違いは何ですか?

ホットタグ

アーカイブ