IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Cast et manipulation de mémoire


Sujet :

C

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2018
    Messages : 6
    Points : 6
    Points
    6
    Par défaut Cast et manipulation de mémoire
    Bonjour / bonsoir,

    Je reviens avec une nouvelles question mais cette fois sur le fonctionnement des cast en C et leurs impact sur la manipulation de la mémoire. Je m'explique :

    Je dois reproduire le fonctionnement de memcpy. Et il se trouve que j'ai une implémentation qui semble fonctionner mais je ne comprend pas pourquoi elle fonctionne. Si je passe en paramètre les adresses de deux int et que je ne souhaite copier qu'un octet alors memcpy va effectivement modifier uniquement le premier octet.

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    int main()
    {
    	int 	*i_dst;
    	int 	dst;
    	int		i_src;
     
    	i_dst = malloc(sizeof(int) * 1);
    	dst = 23;
    	i_dst = &dst;
     
    	i_src = 1200;
    	i_dst = ft_memcpy(((void*)i_dst), &i_src, 1);
    	ft_putnbr(*i_dst);
     
    	return (0);
    }
    23 --> 00010111

    1200 --> 100 10110000

    résultat de ce programme : 176

    176 --> 10110000

    donc on a bien pris que le premier octet de l'int.

    Mon implementation est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void	*ft_memcpy(void *dst, const void *src, size_t n)
    {
    	size_t	index;
     
    	index = 0;
    	while (index < n)
    	{
    		((unsigned char *)dst)[index] = ((unsigned char *)src)[index];
    		index += 1;
    	}
    	return (dst);
    }
    Ma question est la suivante : pourquoi est ce que mon programme ne prend que le premier octet d'un int ? Quelle partie de mon code permet cela ?
    En réfléchissant un peu, j'ai émis l'hypothèse suivante :
    Un unsigned char est codé sur un octet, puisque j'ai casté mon int en unsigned char, le compilateur pense que je joue avec des variables qui ne font qu'un octet et donc il s'arrête la.

    Mais alors si je veux écrire sur deux octets ou plus, je vais boucler deux fois ou plus et que signifieras alors src[1 ou +] ?

    Je pense que mon intérrogation provient de ma faible connaissance sur les void* mais même en cherchant je n'arrive pas à trouver ce que je cherche.

    Merci en tout cas d'avoir lu jusqu'ici et au plaisir de vous lire rapidement.

  2. #2
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Un pointeur C est l'association d'une adresse et d'un type, type qui sert principalement à déterminer la taille de l'objet situé à cette adresse. Lorsque l'on effectue l'addition d'un pointeur et d'une valeur entière, l'adresse est toujours « décalée » d'un multiple de la taille de l'objet pointé. Autrement formulé, étant donné p un pointeur vers un type quelconque et n une valeur entière alors p + n == &p[n] == (unsigned char *)p + n * sizeof *p.

    C'est la raison pour laquelle on ne peut pas faire d'arithmétique sur un void *, puisque la taille de void est une notion dénuée de sens, et que tu dois cast les paramètres de ton memcpy vers unsigned char * afin de pouvoir adresser tes buffers plus loin que leur premier byte.

    void * permet ainsi d'implémenter des traitements génériques (indépendants du type des données).

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2018
    Messages : 6
    Points : 6
    Points
    6
    Par défaut
    Merci beaucoup, je comprend mieux !

    T'as formule est super claire et utile !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Cast de données - problème mémoire
    Par black-falco dans le forum Général Python
    Réponses: 13
    Dernier message: 27/08/2010, 01h27
  2. Réponses: 3
    Dernier message: 27/08/2009, 14h06
  3. new/delete/cast, fuite de mémoire ou pas ?
    Par boli_971 dans le forum C++
    Réponses: 7
    Dernier message: 18/04/2009, 13h40
  4. Manipulation ArrayList et cast
    Par Jarro dans le forum C#
    Réponses: 6
    Dernier message: 07/03/2008, 13h58
  5. Réponses: 3
    Dernier message: 04/09/2007, 21h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo