1

ポインターについていくつか質問があります。

私は次の構造体を持っています

struct buffer {
    char *ptr;
    char data[DATA_SIZE];
};

そして私は次のコードを持っています

printk("ptrs and what not:  buf=%p, b-ptr=%p,   b-data=%p,    INIT_LOC=%lu\n", buf, buf->ptr, buf->data, INIT_LOC);

if (buf)
    buf->ptr = buf->data + INIT_LOC;

printk("ptrs and what not:  buf=%p, b-ptr=%p,   b-data=%p,    INIT_LOC=%lu\n", buf, buf->ptr, buf->data, INIT_LOC);

出力は次のとおりです。

ptrs and what not:  buf=ffff880091ae2000, b-ptr=          (null),   b-data=ffff880091ae2008,    INIT_LOC=10
ptrs and what not:  buf=ffff880091ae2000, b-ptr=ffff880091ae2012,   b-data=ffff880091ae2008,    INIT_LOC=10

質問

1) 数値を追加する場合、アドレスを持つ ptr に 2 とします。たとえば、10001 が値 10003、または 10001 + 2 * sizeof(X) であるとします。x は ptr のタイプです。

2) ptr=10001 がメモリ内の文字の配列である場合、その配列の最初の文字は位置 10001 にあり、2 番目の文字は位置 10002 または 10009 にありますか? またはそれは何でしょうか?

3) 上記の buf->data のアドレスは 2008 です。10 を追加すると 2012 を指すようになるのかわかりません。

前もって感謝します。

4

3 に答える 3

2

1) 数値を追加する場合、アドレスを持つ ptr に 2 とします。10001 は値 10003、または 10001 + 2 * sizeof(X) であり、x は ptr のタイプです。

加算と減算は、ポインター X要素を前後に移動します。これにより、マルチバイト オブジェクトの中央を指すポインターが正しく配置されなくなります。(ポインター型間で無効なキャストを行っている場合を除きます)。

2) ptr=10001 がメモリ内の文字の配列である場合、その配列の最初の文字は位置 10001 にあり、2 番目の文字は位置 10002 または 10009 にありますか? またはそれは何でしょうか?

10002 なので、sizeof(char)1 です。

3) 上記の buf->data のアドレスは 2008 です。10 を追加すると 2012 を指すようになるのかわかりません

16 進数表記に注意してください。

于 2012-12-05T19:26:12.047 に答える
2
  1. 10001 + 2 * sizeof(X)
  2. 10002
  3. 16 進数で、0x2012-0x2008 は 10 進数で 10 に相当します。
于 2012-12-05T19:25:08.663 に答える
0

1) どちらも間違っています。X はポインティのタイプです。

2) アーキテクチャが char より小さいものを扱えない場合は、10002 にする必要があります。

3) 0x2008 + 10 = 0x2012

于 2012-12-05T19:25:28.200 に答える