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 :

Espace memoire tableau


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 110
    Par défaut Espace memoire tableau
    Bonjour,

    il y a un point que je ne saisie pas le voici:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int nombre[1];
      int copier[]={32,23,54,33,13};
      strcpy(copier,nombre);
    j'ai déclarer un tableau de 1 seul int (composé de 4 octet le int) donc 4*1=4 donc je ne peux dépasser 4 chiffres dans la mémoire nan ?

    Après je déclarer un tableau de int contenant 5 éléments, par conséquent si je copie la variable copier dans nombre ça devrait provoquer un bug nan ?

    MERCI!

  2. #2
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    "int nombre[1];" déclare un tableau de un int, c'est correct. Mais si un int est codé avec 4 octets (en utilisant sûrement la technique du complément à deux), alors les nombres représentables sont ceux qui sont compris entre -2147483648 et 2147483647. Ensuite strcpy ne s'utilise que pour copier des chaînes de caractères, là tu copies des entiers. En plus, d'après la manière dont tu as formulé ta question, tu sembles croire que strcpy(x, y) copie x vers y, pourtant ce sera y qui sera copié dans x. Enfin, je n'ai pas su deviner ce que tu cherches à faire.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 110
    Par défaut
    a oui mince j'ai oublier que ça s'appliqué que sur des chaines de caractéres;

    En faite mon objectif est de buguer le programme , je n'arrive pas pourtant ça devrait le faire,

    int chaine1[1]={12};
    int chaine2[2]={12,38};

    donc si je copie la chaine 2 dans la 1 ça devrait planter le programme nan ? puisque chaine1 est un tableau de 1 seul int (4 octet donc 4 nombre de 12) et la chaine2 est un tableau de 2 int (2*4=8 elements de 12 et 38) donc le code devrait planter ?

    Pouvez vous me corriger je pense que je me suis mal exprimé pour expliquer merci

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    donc si je copie la chaine 2 dans la 1 ça devrait planter le programme nan ?
    Pas forcément. Si tu utilises strcpy, la copie s'arrête dès que la valeur pointée par src est 0 (qui est lui-même copié). D'où le fait qu'il faille utiliser cette fonction uniquement pour les chaînes de caractères.
    Le programme va planter par exemple dès qu'il sort de son espace mémoire. Si la valeur \0 est trouvée avant, cela ne plante pas forcément... ou pas ! Car, en écrasant les valeurs (car si tu écris n'importe où) tu peux modifier le code de ton programme, ses données... et le faire planter.
    En tout cas, plantage ou pas plantage, c'est un méchant bug.

    Si tu veux crasher ton programme, ce simple code suffit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char *bidule = NULL;
    *bidule = 0;
    ou bien par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    char truc;
    char * pointeur = &truc;
    while (1)
    {
       *pointeur++ = 0;
    }
    Après, je ne vois pas l'intérêt de taper du code exprès pour le faire crasher...

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 110
    Par défaut
    Mon objectif etait de comprendre l'etat de la memoire dans les variable je ne comprenait pas pourquoi en metant une donnée en [] et lorsque je la depassé rien ne se passé ..

    Merciii

  6. #6
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    507
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mai 2006
    Messages : 507
    Par défaut
    Bonjour,

    Pour revenir à ton code initial, la copie d'un tableau dans un autre peut s'effectuer de cette manière:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    int chaine1[1]={12};
    int chaine2[2]={12,38};
    memcpy (chaine1, chaine2, sizeof (chaine2)); // Copie de chaine2 dans chaine1
    Le soucis c'est que malgré que ce code soit erroné, il ne plantera pas forcément. La première valeur de chaine2 sera bien copiée dans chaine1, mais la seconde va être écrite juste après, sur une zone mémoire que tu ne controles pas forcément, ou qui est déjà utilisé par une autre variable. En gros le comportement est imprévisible...

    Peut-être que ça plantera, peut-être que ça marchera sans aucun problème !

  7. #7
    Inactif  
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    570
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Septembre 2003
    Messages : 570
    Par défaut
    Citation Envoyé par boubz013 Voir le message

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int chaine1[1]={12};
    int chaine2[2]={12,38};
    donc si je copie la chaine 2 dans la 1 ça devrait planter le programme nan ?
    déjà tu n'a pas déclaré des chaines de caractères :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char chaine1[1]={12};
    char chaine2[2]={12,38};
    pour générer une erreur de segmentation

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 110
    Par défaut
    AA OUI JE VIiens de comprendre je vous remercie bonne journée !!

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

Discussions similaires

  1. liberer l'espace memoire
    Par ralf91 dans le forum C
    Réponses: 9
    Dernier message: 21/04/2007, 09h44
  2. comment calculer l'espace memoire
    Par Asmod_D dans le forum Développement 2D, 3D et Jeux
    Réponses: 5
    Dernier message: 20/05/2006, 20h55
  3. Réponses: 7
    Dernier message: 26/04/2006, 16h16
  4. [JVM]Espace mémoire occupé par un objet
    Par devtele dans le forum Général Java
    Réponses: 6
    Dernier message: 29/12/2005, 23h15
  5. int DWORD et espace memoire
    Par zbooon dans le forum C
    Réponses: 4
    Dernier message: 19/09/2005, 11h28

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