1

この質問をする前に、これ、これ、およびこのSOの投稿参照 まし

友人に動的メモリ割り当てを教えている間、私は簡単なプログラムを書きました。そのスニペットは以下のとおりです。

matrix = (int**) malloc (sizeof(int*) * m);
for (i = 0; i < m; ++i)
matrix[i] = (int*) malloc (sizeof(int) * n);

for (i = 0; i < m; ++i)
  for (j = 0; j < n; ++j)
      matrix[i][j] = rand() % 100; /*some random value*/


for (i = 0; i < m; ++i)
{
  for (j = 0; j < n; ++j)
  {
      printf("(%8u)%-5d", &matrix[i][j], matrix[i][j]);
  }

  /* Print element just after the first row*/
  printf("(%8u)%-5d", matrix[i] + n, *(matrix[i] + n));

  /* Print second NEXT element just after the first row*/
  printf("(%8u)%-5d", matrix[i] + n + 1, *(matrix[i] + n + 1));
}

このプログラムを次のように実行すると

unmesh@unmesh-laptop:~/teaching/C/Day3$ ./matrix
Enter number of rows: 3
Enter number of columns: 3

(141189144)1    (141189148)2    (141189152)3    **(141189156)17**   (141189160)2    

(141189160)2    (141189164)3    (141189168)4    **(141189172)17**   (141189176)3    

(141189176)3    (141189180)4    (141189184)5    (141189188)135105(141189192)0 

値17に興味があります。誤解しない限り、この呼び出しではmallocへの呼び出しが3回あるため、観察できるようにメモリが連続していない可能性があります。しかし、 m = n=4またはm=n = 5でプログラムを実行すると、各行の後に値25が表示されます。m = n=6およびm=n = 7の場合、値33が観察されます。

さらに興味深いのは、nが奇数の場合(n = 3 / n = 5 ..)、この値は行が終了した直後に格納されるという事実です。m = n=3の場合の行の例

Values  1        2       3       17  
Address 100      104    108     112  

Next row starts from 116

nが偶数の場合、m = n = 2の場合、4バイトの例の行の後に格納されます。

Values  1        2       0       17  
Address 100      104    108     112  

Next row starts from 116

問題は、これらの値17/25/33はどこから来ているのかということです。なぜそれらは常に同じですか?私はそれらがゴミではなく、何らかの意味を持っているに違いないことを願っています..私は推測することができません。助けてください。

4

1 に答える 1

2

割り当てられたブロックを追跡するために、mallocストアの内部簿記情報が表示されています。この情報の正確な性質とサイズはシステムごとに異なりますが、mallocが要求されたサイズを切り上げて、簿記情報と組み合わせると、結果のブロックが一般的に必要とされる最大の配置の倍数になることがよくあります。あなたのマシン。あなたの場合、アラインメントは8バイト(2 int)のように見え、表示される偶数/奇数の動作につながります。表示される17/25/33の値は、割り当てられたブロックのサイズ(パディングとサイズ情報を含む)であり、使用中のブロックを示すために最下位ビットが設定されている可能性があります。

于 2013-03-08T18:46:16.943 に答える