6

私の質問は、配列のアドレスが最初の位置のアドレスと異なるのはなぜですか?

私は自分のmallocを書き込もうとしていますが、最初はメモリのチャンクを割り当ててアドレスをいじっているだけです。私のコードはおおよそ次のようになります。

#define BUFF_SIZE 1024
static char *mallocbuff;

int main(){
     mallocbuff = malloc(BUFF_SIZE);
     printf("The address of mallocbuff is %d\n", &mallocbuff);
     printf("The address of mallocbuff[0] is %d\n", &mallocbuff[0]);
}

&mallocbuffは、実行するたびに同じアドレスになります。&mallocbuff [0]は、毎回ランダムなアドレスです。アドレスが一致することを期待していました。なぜそうではないのか誰かが説明できますか?

4

3 に答える 3

13

&mallocbuff名前付き変数のアドレスですmallocbuff。で割り当て&mallocbuff[0]た、が指すバッファ内の最初の要素のアドレスです。mallocbuffmalloc()

于 2010-04-24T17:01:34.897 に答える
9

mallocbuffは配列ではなく、ポインターです。これは、mallocが割り当てる場所とは完全に別個に格納されます。

これにより、期待する結果が得られます(必要に応じて)。

int main(){
  char buf[1];
  printf("&buf     == %p\n", &buf);
  printf(" buf     == %p\n",  buf);  // 'buf' implicitly converted to pointer
  printf("&buf[0]  == %p\n", &buf[0]);

  char* mbuf = buf;
  printf(" mbuf    == %p\n",  mbuf);
  printf("&mbuf[0] == %p\n", &mbuf[0]);

  printf("\n&mbuf(%p) != &buf(%p)\n", &mbuf, &buf);

  return 0;
}

出力:

&buf     == 0x7fff5b200947
 buf     == 0x7fff5b200947
&buf[0]  == 0x7fff5b200947
 mbuf    == 0x7fff5b200947
&mbuf[0] == 0x7fff5b200947

&mbuf(0x7fff5b200948) != &buf(0x7fff5b200947)
于 2010-04-24T17:03:15.610 に答える
5

mallocbuf(経由で)のアドレス&mallocbufを取得すると、配列のアドレスは取得されません。配列を指す変数のアドレスが取得されます。

配列のアドレスが必要な場合は、mallocbufそれ自体を使用してください(最初のprintf())。これはと同じ値を返します&mallocbuf[0]

于 2010-04-24T17:03:21.370 に答える