Связывание файлов, имеющих одинаковые переменные, с разными типами данных в C

Опубликовано: 12 Апреля, 2022

Предположим, что есть два кода 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

Хотите узнать о лучших видео и практических задачах, ознакомьтесь с Базовым курсом C для базового и продвинутого C.
C