Memset

Résolu
Bonjour,

Je comprends le fonctionnement général de
memset
sauf les trucs concernant les entiers avec les bytes et autres.

Par exemple :

int tab[10] 
memset(tab, 0, 4 * sizeof(tab[0]))


1. Pourquoi faire tab[0] aulieu de par exemple sizeof(int)*4?
2. Comment savoir ce qu’il y a dans tab[0] vu que on a rien mis encore dans notre tableau
3. Pourquoi aussi lorsqu’on change le 0 par un 10 on obtient des n’ombres bizarres

memset(tab, 10, 4 * sizeof(tab[0]))


Moi je pensais que ça allait remplir les 4 premières cases du tableau avec 10 mais apparemment non
Pourtant si on avait mis 0, ça allait mettre des 0.

6 réponses

  1. Contributeur
    bonjour,
    1) je pense que les deux sont équivalents
    2) on ne sait pas, au départ, ce qu'il y a "dans" tab[0]
    3) cela remplit les octets des 4 premiers
    int
    du tableau.
    1. 3. Ça le remplit comment?

      Par exemple si j’ai :

      int tab1[] = {3, 4};
      int tab2[] = {1, 2};
      memset(tab1, 1, sizeof(int))


      Ça renvoie pour
      tab[0]
      et
      tab[1]
      un nombre bizarre
      16843009
      .

      D’où vient ce chiffre ?
      1. Contributeur
        Cela donne quoi en hexadécimal?
        As-tu une idée de la représentation en memoire des entiers?
    2. Ça donne 01010101
      1. Contributeur
        Ce qui montre bien les 1 dans chaque octet.
    3. Merci j’ai compris

      Pour voir si j’ai compris si à la place de 4 j’avais mis 2,esceque cela veut dire que ça rempli 2 octets avec la valeur 1 et on aurait obtenu 01010000?
      1. Contributeur
        Eh bien, cela dépend du processeur, et parfois du logiciel.
        C'est pour cela qu'il est recommandé d'éviter de travailler sur les octets d'un nombre.

        Plus d'informations: https://fr.wikipedia.org/wiki/Boutisme
    4. Ok merci donc c’est pour cela memset on l’utilise pas souvent

      Une dernière chose
      Si on a :
      char buffer[10];
      memset(buffer, ’\0’, 10)

      Comment ça se fait ça met \0 à la fin de buffer ?
      Moi je pensais que ça allait remplir les 10 premiers octets avec
      ´\0’
      .
      1. Contributeur
        Je pense aussi que cela remplit les 10 premiers octets avec ´\0’.
        Je me demande si tu as correctement examiné le contenu de buffer.
        Peut-être qu'il y a une confusion sur "la fin de buffer"...