Связывание файлов, имеющих одинаковые переменные, с разными типами данных в C
Предположим, что есть два кода foo1.c и foo2.c, как показано ниже, и здесь задача состоит в том, чтобы связать foo1.c и foo2.c, которые имеют одинаковое имя переменной x, но другой тип данных, то есть int в foo1.c и double в foo2.c .
Обратите внимание, что ни одна из переменных не объявлена как extern.
What do you expect to be the output of the following command with given two programs?
$ gcc -o myprog foo1.c foo2.c $ ./myprog
// foo1.c #include<stdio.h> void f( void ); int x = 38; int y = 39; int main() { f(); printf ( "x = % d
" , x); printf ( "y = % d
" , y); return 0; } |
// foo2.c double x; void f() { x = 42.0; } |
Выход:
х = 0 у = 1078263808
Объяснение вывода: Вывод программы выглядит непредсказуемым, но причина такова: в foo1.c есть две переменные x и y, каждая из которых имеет 4 байта (всего 8 байтов). В foo2.c есть переменная x как double.
Во время выполнения x в foo1 (4 байта) заменяется на x в foo2 (8 байтов) . В конечном итоге память x и y (всего 8 байтов) в foo1 перезаписывается x в foo2 (8 байтов).
Значение 1078263808 представляет собой представление 42 числа с плавающей запятой в формате double.
ПРИМЕЧАНИЕ: адреса x и y в foo1.c идут последовательно.
Связанная статья: Внешние и внутренние ссылки в C