Salut,
Le premier conseil que l'on peut te donner, c'est de vérifier systématiquement tout les retours de fonctions qui renvoient des pointeurs.
int **p = (int**) malloc(sizeof (int*) * 3);
ne devrait pas échouer, mais on ne sait jamais...
Si malloc échoue, p vaudra NULL. Il faut donc vérifier si tu obtiens quelque chose de différent de NULL avant d'aller plus loin.
Il en va de même pour
p[i] = (int*) malloc( sizeof (int) * 3);
Les deux lignes que je viens de montrer risquent vraiment très peu d'échouer, car l'espace nécessaire à la représentation de trois pointeurs ou de trois entiers n'est pas particulièrement immense, mais on ne sait jamais.
Par contre, il reste une dernière ligne qui risque de renvoyer un pointeur NULL :
file =fopen("kernel.txt","r");
Et pour cette ligne, le risque est beaucoup plus grand, car l'ouverture du fichier peut échouer pour de nombreuses raisons:
- Il faut que le fichier existe dans le dossier dans lequel il sera recherché
- Il faut que le fichier ne soit pas -- pour une raison ou une autre -- verrouillé (par une autre application
) afin d'éviter qu'on y accède - Il faut que l'on dispose des droits suffisant pour accéder au fichier (surtout sous linux
) - J'en passe, et sans doute de meilleures

A ce sujet, on peut décemment se poser la question de savoir pourquoi tu transmet un char* nommé kernel si c'est pour, quand même, utiliser le nom du fichier "kernel.txt" codé en dur 
Mais, selon moi, il y a simplement de très grandes chances pour que le fichier kernel.txt ne se trouve simplement pas à la bonne place.
Du coup, il ne pourra pas être ouvert, ce qui fait que file vaudra NULL .
Et toute tentative d'utilisation de file t'enverra systématiquement sur les roses avec une erreur de segmentation, car NULL représente une adresse invalide (et donc, inutilisable en tant que telle
)
Partager