Почему эта программа РАБОТАЕТ? - C (СИ)

Формулировка задачи:

У меня есть две структуры, с одинаковым кол-вом полей, но поля разного типа:
struct hat
{
    char s1[20], s2[20], s3[20] ;
} shapka;
 
typedef struct monopolies
{
    char name[40];
    int year;
    float capital;
 
}monopolies;
monopolies monopoly; //создаю тут структуру типа monopolies
Есть функция для обработки "шапки": ( если что, это считывание шапки таблицы из файла, но это не важно)
void Read_Shapka_File(FILE *f, struct hat *shapka) //как вы видите, отдаю в ф-ию указатель на структуру типа hat
{
    if (fscanf(f, "%s%s%s", shapka->s1, shapka->s2, shapka->s3)!=EOF)
    {
        printf("%-20s %15s %20s\n\n", shapka->s1, shapka->s2, shapka->s3);
    }
    else
    {
        exit(ERROR_READING_FILE);
    }
}
...И совершенно другая, отдельная ф-ия, в которую я отдаю указатель на вторую структуру.
void Job1_Two_Files(char* putInp, monopolies *monopoly)
В этой ф-ии я вызываю ф-ию Read_Shapka_File, но отдаю ей указатель на другую структуру, не ту, что положено:
Read_Shapka_File(inp, monopoly);
. Мало того что компилятор не ругается, но программа работает и выводит-таки эту "шапку". КАК??? Если это из-за указателей в обеих ф-иях, это не объясняет, почему нет конфликта типов. Скидываю программу, постарался удалить все, что не относится к данной проблеме

Код к задаче: «Почему эта программа РАБОТАЕТ? - C (СИ)»

textual
    if (inp=fopen(putInp, "r")==NULL)

5   голосов, оценка 4.400 из 5


СОХРАНИТЬ ССЫЛКУ