1) int* pos=(int*)malloc(sizeof(int)); /*allouer la memoire pour le tableau position */
Matrice* M=AllouerMatrice(strlen(mot)+1,1); / *allouer la memoire pour la matrice */
Caster la valeur de retour de *alloc est inutile en C (bien qu'obligatoire en C++, mais c'est un autre langage). Le cast peut même cacher une erreur : en l'absence d'inclusion de l'en-tête stdlib.h, le prototype de malloc n'est pas "connu" au moment où tu appelles cette fonction. En mode C90, le compilateur supposera alors qu'elle renvoie le type int. Sur certaines archi, les conséquences sont nulles, mais il existe des achi sur lesquelles le code se comportera de manière erratique. Si, par exemple, des registres différents sont utilisés pour les entiers et les pointeurs, alors malloc renverra sa valeur de retour dans un registre "pointeur", et le code appelant ira chercher la valeur dans un registre "entier". D'où incohérence, et comportement indéfini garanti.
Si tu affectais le retour de malloc dans une variable de type pointeur sur quelque chose, alors le compilateur devrait te renvoyer une erreur (*). Si tu castes la valeur avant l'affectation, comme tu le fais, alors le compilateur ne dit plus rien, car il suppose que tu sais ce que tu fais.
Note qu'en mode C99, la règle du int implicite quand une fonction sans prototype visible est appelée n'existe plus, c'est directement une erreur (comportement indéfini, je crois, mais bref), et donc la question ne se pose plus.
2)
Si malloc n'arrive pas à allouer de la mémoire, elle renvoie un pointeur nul. Il faut donc faire un test :
if (pos == NULL)
{
/* En cas d'erreur */
}
else
{
/* Le comportement "normal" */
}
.
(*) En passant, le message d'erreur de gcc dans cette situation est très peu explicite pour celui qui ne connaît pas les détails du C...
# Malloc
Posté par alf . En réponse au message creation d'une matrice de sous mot. Évalué à 2.
int* pos=(int*)malloc(sizeof(int)); /*allouer la memoire pour le tableau position */
Matrice* M=AllouerMatrice(strlen(mot)+1,1); / *allouer la memoire pour la matrice */
Caster la valeur de retour de *alloc est inutile en C (bien qu'obligatoire en C++, mais c'est un autre langage). Le cast peut même cacher une erreur : en l'absence d'inclusion de l'en-tête stdlib.h, le prototype de malloc n'est pas "connu" au moment où tu appelles cette fonction. En mode C90, le compilateur supposera alors qu'elle renvoie le type int. Sur certaines archi, les conséquences sont nulles, mais il existe des achi sur lesquelles le code se comportera de manière erratique. Si, par exemple, des registres différents sont utilisés pour les entiers et les pointeurs, alors malloc renverra sa valeur de retour dans un registre "pointeur", et le code appelant ira chercher la valeur dans un registre "entier". D'où incohérence, et comportement indéfini garanti.
Si tu affectais le retour de malloc dans une variable de type pointeur sur quelque chose, alors le compilateur devrait te renvoyer une erreur (*). Si tu castes la valeur avant l'affectation, comme tu le fais, alors le compilateur ne dit plus rien, car il suppose que tu sais ce que tu fais.
Note qu'en mode C99, la règle du int implicite quand une fonction sans prototype visible est appelée n'existe plus, c'est directement une erreur (comportement indéfini, je crois, mais bref), et donc la question ne se pose plus.
2)
Si malloc n'arrive pas à allouer de la mémoire, elle renvoie un pointeur nul. Il faut donc faire un test :
.
(*) En passant, le message d'erreur de gcc dans cette situation est très peu explicite pour celui qui ne connaît pas les détails du C...