0

このコードの場合

#include <stdio.h>
#include <stdlib.h>
int main()
{
int i, j, k, l;
int *ii = (int *)malloc(sizeof(int));
int *jj = (int *)malloc(sizeof(int));
int *kk = (int *)malloc(sizeof(int));
int m, n, o, p;
// Call below line as star line
printf("%u %u %u %u %u %u %u %u %u %u %u\n",&i,&j,&k,&l,&ii,&jj,&kk,&m,&n,&o,&p);
// Call below line as delta line
printf("%u %u %u %u %u %u %u %u %u %u %u\n",&i,&j,&k,&l,ii,jj,kk,&m,&n,&o,&p);
 return 0;
}

この出力を取得しています

2293516 2293512 2293508 2293504 2293500 2293496 2293492 2293488 2293484 2293480 2293476
2293516 2293512 2293508 2293504 3739288 3739320 3739336 2293488 2293484 2293480 2293476

今まではすべてクリアですが、コメントするとスターラインの出力は

2293520 2293516 2293512 2293508 4525720 4525752 4525768 2293504 2293500 2293496 2293492

私の質問は、この場合、メモリ位置が隣接していない理由です。最初のケースの2行目では、値は通常の差で4バイト、つまり516、512、508、504、次に3つの場所、次に488、484、480 ...でしたが、2番目のケースでは値は520、516、512、508です。 、次に3つの場所、次に504、500、496。なぜここで508の後の次の値は504であるのに、492である必要があるのでしょうか。ここにprintfの役割はありますか?

4

1 に答える 1

2

コンパイラは、メモリ内のローカル変数を自由に配置できますが、適切と思われます。

ローカル変数が連続して格納されること、変数間に名前のないパディングがないこと、またはメモリ内に特定の順序で格納されることは保証されません。

また、実行時にローカル変数が実際に存在するという保証はまったくありません。たとえば、最初の をコメント アウトするprintfと、ローカル変数iijj、およびが左辺値としてkk使用されることはありません (基本的に、オブジェクトのアドレスを必要とすることは一切行いません)。そのため、コンパイラはこれらの変数を完全に削除することを選択する場合があります。

特定の例では、コンパイラは3つの変数すべてをメモリ内の同じ場所に格納することを決定する場合があります。または、変数を初期化しないため、メモリ内の他の場所のランダムな内容を使用する場合があります。 「有効な」動作。

于 2012-04-13T19:49:22.673 に答える