Я читаю этот код здесь (на китайском языке). Существует один фрагмент кода для тестирования глобальной переменной в C. Переменная a
определена в файле t.h
, который был включен дважды. В файле foo.c
определен a struct b
с некоторым значением и функцией main
. В файле main.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
изменился. Я не понимаю, как это работает!