2

私はアプリケーションを書いていますが、いくつかのポインター演算を行う必要がありました。ただし、このアプリケーションは異なるアーキテクチャで実行されます! これが問題になるかどうかはよくわかりませんでしたが、この記事を読んだ後、変更する必要があると思いました.

あまり好きではなかった元のコードは次のとおりです。

class Frame{
  /* ... */
protected:
  const u_char* const m_pLayerHeader; // Where header of this layer starts
  int m_iHeaderLength;                // Length of the header of this layer
  int m_iFrameLength;                 // Header + payloads length
};

/**
 * Get the pointer to the payload of the current layer
 * @return A pointer to the payload of the current layer
 */
const u_char* Frame::getPayload() const
{
  // FIXME : Pointer arithmetic, portability!
  return m_pLayerHeader + m_iHeaderLength;
}

かなり悪いですね!ポインタにint値を追加!u_charしかし、私はこれに変更しました:

const u_char* Frame::getPayload() const
{
  return &m_pLayerHeader[m_iHeaderLength];
}

私は今、コンパイラがジャンプする量を言うことができると思います! 右?配列に対する操作は[]ポインター演算と見なされますか? 移植性の問題は解決しますか?

4

3 に答える 3

10

p + iとがポインタで整数型の値の&p[i]場合は同義です。あなたが書くことさえできるほど多く、それはまだ有効です(あなたが書くことができるのと同じように)。pi&i[p]i + p

リンクする例の移植性の問題は、sizeof(int)プラットフォーム間で異なることに起因していました。あなたがスキップしたい sm_iHeaderLengthの数であると仮定すると、あなたのコードは問題ありません。u_char

于 2012-11-14T08:41:07.157 に答える
1

あなたのコードでは、m_pLayerHeader を m_iHeaderLength u_chars だけ進めています。あなたが指しているデータを書いたものがu_charと同じサイズであり、i_HeaderLengthがヘッダー領域のu_charの数である限り、安全です。

しかし、m_iHeaderLengthu_chars ではなく実際にバイトを参照している場合m_iHeaderLength、char 以外の型を超えてポインターを進めることになっている場合、問題が発生する可能性があります。

16 ビット システムから 32 ビット システムにデータを送信するとします。ヘッダー領域は次のように定義されます。

struct Header {
    int something;
    int somethingElse;
};

これは、フレーム構造体によって定義されたメッセージ全体の一部に過ぎないと仮定します。

32 ビット マシンでは、16 ビット マシンが読み取るポートにデータを書き込みます。

port->write(myPacket, sizeof(Frame));

16 ビット マシンでは、同じヘッダー定義があり、情報を読み取ろうとします。

port->read(packetBuffer, sizeof(Frame));

送信者が書き込んだ量の 2 倍の量のデータを読み取ろうとしたため、既に問題が発生しています。読み取りを行う 16 ビット マシンの int のサイズは 2 で、ヘッダーのサイズは 4 です。しかし、ヘッダーのサイズは、送信側のマシンでは 8 で、それぞれ 4 バイトの 2 つの int です。

次に、ポインタを進めようとします

m_iHeaderLength = sizeof(Header);
...
packetBuffer += m_iHeaderLength;

packetBuffer発信者から送信されたフレームのヘッダーにあったデータを引き続き指しています。

于 2012-11-14T08:30:00.880 に答える
0

移植性の問題がある場合、いいえ、それは解決しません。m_pLayerHeader + m_iHeaderLength&m_pLayerHeader[m_iHeaderLength]は完全に同等です (この場合)。

于 2012-11-14T08:36:15.333 に答える