-1

以下のコード スニペットを参照してください。

#include <iostream>
using namespace std;

int main()
{
uint32_t len, x;
char abc[] = "12345678";
uint8_t *ptr = (uint8_t *)abc;
copy(ptr, ptr + 4, reinterpret_cast<uint32_t*>(&len));
cout << " len: " << len << endl;
} 

出力は49です!出力を1234にしたいのですが、何か不足していますか

4

3 に答える 3

5

ターゲットは、長さ1の「コンテナ」(つまり、単一のオブジェクトlen)です。

後続の4つのバイト値をこのコンテナにコピーしていますが、これはもちろん失敗します。特に、ターゲットには単一の要素用のスペースしかないため、オーバーフローが発生します。

コード内の他のエラー(完全なリストではありません):

  • 文字コードとその文字列表現を混同しています
  • 冗長キャストを実行しています

特に最初のポイントは、文字列の最初の4文字にエンコードされた数値を10進数として解析することであるため、関連性があります。しかし、実際に行うことは、その文字コードをコピーすることです。

C ++で数値を解析するには、std::stringstreamまたはを使用します。C++ 11以降、std::stoi

于 2012-06-21T12:46:09.280 に答える
1

std:copy は期待どおりに機能しません。ソースを「要素ごと」にコピー先にコピーします。したがって、最初の uint8 (= char '1' == 16 進数で 0x49) を 'len' にコピーし、メモリ内で続く 3 つのランダムな uint32 値を踏みにじります。

これは、実際に何が起こっているかを確認するためのものです。

#include <iostream>
using namespace std;

int main()
{
  uint32_t len[4];
  char abc[] = "12345678";
  copy(abc, &abc[4], &len[0]);
  cout << " len: " << len[0] << " " <<len[1] << " " << len[2] << " " << len[3] << endl;
} 
于 2012-06-21T12:51:13.253 に答える
0

まず、std::copy大まかに次のようにします。

template <typename InputItr, typename OutputItr>
void copy(InputItr begin, InputItr end, OutputItr obegin)
{
    while (begin != end)
        *obegin++ = *begin++;
}

出力イテレータは ですuint32_t*。これにより、実際には 4 つの 32 ビット ワードが上書きされます。(バッファ オーバーフロー)。49コピーされた最初の文字 ( ) の ASCII 値は 49 であるため、表示'1'されています。

于 2012-06-21T12:49:38.580 に答える