Во-первых, вы не компилировали с включенными предупреждениями. Обычно вы должны вызывать gcc по крайней мере с ключом -Wall
- для вашего примера кода, который дает:
x.c: In function 'main':
x.c:7: warning: implicit declaration of function 'f1'
x.c: At top level:
x.c:15: warning: return type defaults to 'int'
x.c: In function 'f1':
x.c:16: warning: format '%d' expects type 'int', but argument 2 has type 'int *'
x.c:17: warning: control reaches end of non-void function
Во-вторых, причина, по которой он компилируется, состоит в том, что все ошибки в нем имеют форму, называемую «неопределенное поведение», что означает, что компилятору не требуется для их диагностики и остановки компиляции - это может просто привести к результатам мусора.