использование extern для связывания массива с указателем

Предположим, у меня есть два файла: file1.c– содержит глобальное определение массива int размера 10 с именем «array [10]». file2.c- содержит указатель int с именем «extern int * array», здесь я пытаюсь связать этот указатель с массивом.

Но когда я проверяю адрес массива в файле file1.c и значение указателя в файле2.c, они оба разные. Почему это происходит?

Это не работает, в file2.c , вам нужно

 extern int array[]; 

поскольку массивы и указатели – это не одно и то же. Оба объявления должны иметь совместимые типы, а int* несовместим с int[N] .

То, что на самом деле происходит, не указано, программа плохо сформирована с помощью extern int *array; , но, вероятно, первые байты sizeof(int*) массива интерпретируются как адрес.

extern1.c

 #include  extern int *array; int test(); int main(int argc, char *argv[]) { printf ("in main: array address = %x\n", array); test(); return 0; } 

extern2.c

 int array[10] = {1, 2, 3}; int test() { printf ("in test: array address = %x\n", array); return 0; } 

Выход:

 in main: array address = 1 in test: array address = 804a040 

И код сборки:

 08048404 
: 8048404: 55 push %ebp 8048405: 89 e5 mov %esp,%ebp 8048407: 83 e4 f0 and $0xfffffff0,%esp 804840a: 83 ec 10 sub $0x10,%esp 804840d: 8b 15 40 a0 04 08 mov 0x804a040,%edx <--------- this (1) 8048413: b8 20 85 04 08 mov $0x8048520,%eax 8048418: 89 54 24 04 mov %edx,0x4(%esp) 804841c: 89 04 24 mov %eax,(%esp) 804841f: e8 dc fe ff ff call 8048300 8048424: e8 07 00 00 00 call 8048430 8048429: b8 00 00 00 00 mov $0x0,%eax 804842e: c9 leave 804842f: c3 ret 08048430 : 8048430: 55 push %ebp 8048431: 89 e5 mov %esp,%ebp 8048433: 83 ec 18 sub $0x18,%esp 8048436: c7 44 24 04 40 a0 04 movl $0x804a040,0x4(%esp) <------- this (2) 804843d: 08 804843e: c7 04 24 3d 85 04 08 movl $0x804853d,(%esp) 8048445: e8 b6 fe ff ff call 8048300 804844a: b8 00 00 00 00 mov $0x0,%eax 804844f: c9 leave 8048450: c3 ret

Обратите внимание на <------- в коде сборки. Вы можете видеть в основной функции массив массив [0], а в тестовой функции массив - это адрес.