memset sur un tableau de structures

memset sur un tableau de structures

by Cyrille Pittet -
Number of replies: 5

Bonjour,

Petite question par rapport au memset :

Si par exemple, j'ai un tableau "tab" qui contient des struct qui elles mêmes contiennent par exemple 2 champs : un de type int et un pointeur.

Est-ce que faire un memset(tab, 0, sizeof(tab)) va mettre tous les éléments de tab à NULL, ou cela initialise tous les champs de tous les éléments de tab à respectivement 0 et NULL ?


Merci d'avance et bon week-end :-)

Cyrille

Tags:
In reply to Cyrille Pittet

Re: memset sur un tableau de structures

by Aurélien Clergeot -

Sauf erreur de ma part, en C, NULL=0 (en C++ aussi, mais il y a le null_ptr pour les différencier).

Donc quand tu fais un memset(), tu met l’entièreté de ton tableau à 0, ce qui pour les pointeurs, sera interprété comme NULL.

In reply to Cyrille Pittet

Re: memset sur un tableau de structures

by Deleted user -

Bonjour,

Dans la situation que vous présentez, c'est le deuxième cas qui s'applique; votre utilisation de memset initialisera les champs des éléments de tab - des structures - respectivement à 0 et NULL.

Si en revanche, il s'agissait d'un tableau de pointeurs sur une structure, alors ce serait le premier cas qui s'applique à savoir l'initialisation de tous les éléments de tab - des pointeurs - à NULL.

In reply to Deleted user

Re: memset sur un tableau de structures

by Deleted user -

Je me permets également de faire une remarque sur memset(tab, 0, sizeof(tab)), plus précisément sur sizeof(tab). Cela sera évoqué plus tard dans le cours, mais il me semble pertinent de dire quelques mots à ce sujet compte tenu de votre exemple.

Suivant l'endroit du code où vous appelez sizeof(tab), vous risquez d'avoir une mauvaise surprise sur le résultat que vous obtiendrez. Pour illustrer mon propos, je vous présente deux exemples:


#define N ...

void foo() {
  int tab[N];
  sizeof(tab); /* == N * sizeof(int) */ }
 

Dans ce premier exemple, sizeof(tab) retourne bien le nombre d'octets nécessaires pour représenter en mémoire un tableau de N entiers.


#define N ...

void foo() {
  int tab[N];
  bar(tab);
}

void bar(int tab[]) {
  sizeof(tab); /* == sizeof(int*) */ }
 

Dans ce deuxième exemple, sizeof(tab) retourne le nombre d'octets nécessaires pour représenter en mémoire un pointeur sur un entier.

Le cours expliquera en temps voulu le pourquoi du comment. En attendant, gardez juste à l'esprit que si vous invoquez sizeof sur un tableau déclaré dans une portée différente, vous n'obtiendrez pas le nombre d'octets pour représenter le tableau. 

In reply to Deleted user

Re: memset sur un tableau de structures

by Jean-Cédric Chappelier -

Merci Yassin pour cette mise en garde.

> gardez juste à l'esprit que si vous invoquez sizeof sur un tableau déclaré dans une portée
> différente, vous n'obtiendrez pas le nombre d'octets pour représenter le tableau. 

Je réinsiste : un tableau n'a pas connaissance de sa taille ! ;-)
(parfois on a de la « chance » et sizeof peut aider, mais comme souligné par Yassin ça ne fonctionne PAS dans les fonctions ; on en reparlera)