私はthis code from here(中国語)を読んでいます。 Cでグローバル変数をテストするコードが1つあります。変数a
は、ファイルt.h
に2回含まれています。ファイルfoo.c
には、ある値のstruct b
とmain
の機能が定義されています。 main.c
ファイルでは、初期化されていない2つの変数が定義されています。C異なるファイルで定義された同じグローバル変数
/* t.h */
#ifndef _H_
#define _H_
int a;
#endif
/* foo.c */
#include <stdio.h>
#include "t.h"
struct {
char a;
int b;
} b = { 2, 4 };
int main();
void foo()
{
printf("foo:\t(&a)=0x%08x\n\t(&b)=0x%08x\n
\tsizeof(b)=%d\n\tb.a=%d\n\tb.b=%d\n\tmain:0x%08x\n",
&a, &b, sizeof b, b.a, b.b, main);
}
/* main.c */
#include <stdio.h>
#include "t.h"
int b;
int c;
int main()
{
foo();
printf("main:\t(&a)=0x%08x\n\t(&b)=0x%08x\n
\t(&c)=0x%08x\n\tsize(b)=%d\n\tb=%d\n\tc=%d\n",
&a, &b, &c, sizeof b, b, c);
return 0;
}
UbuntuのGCC 4.4.3コンパイルを使用した後、結果は以下のようである:
foo: (&a)=0x0804a024
(&b)=0x0804a014
sizeof(b)=8
b.a=2
b.b=4
main:0x080483e4
main: (&a)=0x0804a024
(&b)=0x0804a014
(&c)=0x0804a028
size(b)=4
b=2
c=0
変数a
とb
は、二つの機能で同じアドレスを有するが、b
のサイズが変更されました。私はそれがどのように機能するのか理解できません!
あなたの質問がありますか? –
ポインタを出力するために '%p'を使います。ヘッダに' foo'を追加する必要があります。 – Nobilis
競合を解決するには、var staticを宣言します。 – snf