Come ti avevo detto: "supponendo che il tuo esempio sia corretto", il che non è.
Il compilatore, quando lavora, emette dei warning, cioè degli avvisi che possono essere ignorati se uno sa cosa fa, altrimenti è meglio indagare.
Il tuo compilatore avrebbe dovuto dirti che la riga
int main(int argc, char argv[])
è sbagliata; argv è un puntatore a puntatore, non un array, quindi avresti dovuto scrivere
int main(int argc, char *argv[]) // oppure
int main(int argc, char **argv)
Avrebbe anche dovuto dirti che
fscanf(fp, "%d", numero)
si aspetta che l'elenco di parametri variabile (da
numero in poi) sia composto da puntatori. Quindi:
fscanf(fp, "%d", &numero)
Se non te l'ha detto, cambia compilatore o controlla se i warning non siano disabilitati (nel gcc si deve mettere -Wall sulla riga di comando del compilatore, non so se cygwin usa lo stesso schema).
In aiuto potresti usare un IDE che fa dei controlli sul codice
prima della compilazione, come CLion o Visual Studio.