C, la fonction malloc de la taille de
typedef struct _lnode{
struct _lnode *next;
size_t row;
size_t column;
short data;
}lnode;
typedef struct _matrix{
size_t width;
size_t height;
size_t k;
int **data;
}matrix;
matrix* make_matrix(size_t width, size_t height, size_t k){
matrix *m= malloc(sizeof(matrix));
//matrix *m= malloc(sizeof(*matrix)); DOES NOT WORK
if(m==NULL) return NULL;
m->width = width;
m->height = height;
/*
Since m->data is a int **, it points to int *,
so I have to allocate a number of int *-sized objects to store in it.
*/
m->data = malloc(sizeof(int *)*height);
if(m->data == NULL){
free(m);
return NULL;
}
for(size_t i=0; i < height; i++){
m->data[i] = malloc(sizeof(int)*width);
if(m->data[i] == NULL){
for(size_t j = 0; j < i; j++) free(m->data[j]);
free(m->data);
free(m);
return 0;
}
for(size_t j = 0; j < width; j++)
m->data[i][j] = 0;
}
return m;
}
lnode* make_node(size_t row, size_t column, short data){
lnode *newNode = malloc(sizeof(*newNode));
if(newNode==NULL) return NULL;
newNode->row = row;
newNode->column = column;
newNode->data = data;
return newNode;
}
Ces deux fonctions, beau travail. Dans le make_matrix fonction, j'ai d'abord essayé cette
matrix *m= malloc(sizeof(*matrix));
au lieu de
matrix *m= malloc(sizeof(matrix));
Alors il ne fonctionne que pour la première itération de la boucle for et tombe dans l'instruction if
if(m->data[i] == NULL){
for(size_t j = 0; j < i; j++) free(m->data[j]);
free(m->data);
free(m);
return 0;
}
Je sais que sizeof(pointeur) retourne la taille du pointeur. Dans make_node fonction je suis en train de faire lnode *newNode = malloc(sizeof(*newNode)); et il a bien fonctionné. Je suis en train de faire la même chose dans make_matrix fonction. Il ne fonctionne pas en ce moment...
- Il fonctionne très bien (comme il se doit) avec " matrix *m= malloc(sizeof(matrice));`? Si oui, quelle est la question?
Vous devez vous connecter pour publier un commentaire.
newNode
est une variable, alorssizeof *newnode
retourne la taille de la chose qu'il veut pour le pointage. L'équivalent enmake_matrix()
seraitsizeof *m
, passizeof *matrix
.sizeof(*matrix)
moyens pour le compilateur.matrix
est untypedef
, donc*matrix
ne devrait pas être significatif (la syntaxe correcte serait(matrix *)
).Vous dites "je sais que sizeof(pointeur) retourne la taille du pointeur"
Mais je ne pense pas que vous le faites.
Que vous devez faire:
Sinon vous obtenez 4 octets (ou 8, si votre machine 64 bits à l'aide de pointeurs).
"Ça marche" avec ce que vous êtes en train de faire n'est pas correcte. Le comportement est indéfini. Vous avez eu de la chance.
Si je comprends votre question correctement, vous dites que votre code ne fonctionne pas car
m->data[i]
n'est pas nulle?malloc
ne sera pas initialiser vos variables, le contenu de ce que vous obtenez est imprévisible. Utilisationcalloc
pour initialiser tous les bits à zéro, ou encore mieux, si vous disposez d'un standard conforme compilateur d'utiliser quelque chose commepour initialiser tous les champs pour
0
.