2009-08-10 13 views
0

私はkadネットワークへの接続を処理するライブラリをC++で記述することになっています。 私は、aMule & coで使用されているものに準拠したパケットを構築しようとしています。char配列の代入と管理

そして、私は本当にこのコードの違いを理解することはできません。

buffer = "\xe4\x20\x02"; 

と、例えば、このコード:

char p_buffer[36]; 
p_buffer[0] = 0xe4; 
p_buffer[1] = 0x20; 
p_buffer[2] = 0x02; 

buffer = p_buffer; 

は(バッファはしばらくの間、クラスのprivate属性でありますp_bufferはローカル変数)

wiresharkでパケットをキャプチャすると、別の結果が表示されます(最初のものは私が望むように、2番目のものは正しくありません)。

buffer[0] = 0xe4; 

:番目のリトルエンディアン/ビッグエンディアン表記は、私が

、なぜクラスのコンストラクタで

が、私はこのような[プライベート]に「char *バッファ」を変更することはできません...と思いますか?

(それは、私が++暗号使っている問題では、図書館を高めることができれば)どのhelp_、事前に

感謝を

答えて

6

あなたの最初のコードサンプル(それが動作しない、任意のトレースバックエラーなしで終了します)

static const char buffer_internal[4] = { 0xe4, 0x20, 0x02, 0x00 }; 
buffer = buffer_internal; 

ここで2つの違いは次のとおりです:

  • BUFとほぼ同じですフェールはNULLで終了します。
  • バッファーは変更不可能です。変更しようとするとクラッシュする可能性があります。

2番目のサンプルは、36バイトの変更可能なバッファを割り当てます。しかし、このバッファは範囲外になったときにも破棄されます。解放後に使用されないように注意してください。

3番目のサンプルは、ポインタの場合は 'バッファ'を初期化しましたか?あなたは本当にあなたのエラーを診断するのに十分な情報を与えていません。完全なクラスの宣言とコンストラクタが役に立ちます。

+0

ok。問題はその "静的な"キーワードにあった。 ありがとうございました。 –

+0

何を意味するか知らずに「静的」に投げるだけではなく、このクラス、再帰、または複数のスレッドのインスタンスが複数ある場合は、同じバッファを共有するため、データが破損する可能性があります。複数の場所で私はより良い助言を与えるだろうが、具体的な提案をするためにあなたのプログラムについてあまりにも非特異的であった。 – bdonlan

2

""リテラルは、明示的な配列長(この場合ではない)によって制約されない限り、暗黙のNUL終了を持ちます。

また、p_bufferはローカル変数、つまりスタックに割り当てられた自動変数であるため、その内容はゼロに初期化されませんが、下位のスタックメモリにあるすべての迷惑メールが含まれます。

2

ブーストを既に使用している場合は、簡略化された固定長バッファ管理についてはboost::array、可変長バッファの場合はboost::shared_arrayを参照してください。