Problème lecture de code en C
Répondre à la discussion
Affichage des résultats 1 à 3 sur 3

Problème lecture de code en C



  1. #1
    axou8

    Problème lecture de code en C


    ------

    Bonjour,

    Voici un code dont on me demande ce qu'affiche le programme:

    Code:
    #include <stdio.h>
    int F(int *x, int y){
    *x = y + *x;
    y = y + 2* (*x);
    printf("(2) *x == %d, y=%d \n",*x,y);
    return (*x+y);
    }
    int G(int **x, int y){
    y = **x + y;
    printf("(4) **x=%d, y=%d \n",**x,y);
    *x = &y;
    printf("(5) **x=%d, y=%d \n",**x,y);
    return (**x + y + 3);
    }
    int main(){
    int v=2, t=5, *u;
    u=&t;
    t=5;
    *u=*u +v;
    printf("(1) v= %d, t=%d, *u=%d \n",v, t, *u);
    t=F(&v,t);
    printf("(3) v= %d, t=%d, *u=%d \n",v, t, *u);
    *u=G(&u,v);
    printf("(6) v= %d, t=%d, *u=%d \n",v, t, *u);
    }
    J'arrive à
    (1) v=2, t=7, *u=7
    (2) *x==9, y=25
    (3) v=9, t=34, *u=34
    (4) **x=34, y=43
    (5) **x=43, y=43

    Ce qui est correct mais pour le dernier printf, je cale. Selon moi t et *u devraient être tous les deux égaux à 89.

    Donc si une bonne âme pouvait m'expliquer pourquoi ce n'est pas le cas, ce serait fort aimable!

    -----

  2. #2
    lou_ibmix_xi

    Re : Problème lecture de code en C

    Salut,

    Code:
    #include <stdio.h>
    
    int F(int *x, int y){
        *x = y + *x;  // 9
        y = y + 2* (*x); // 25
        printf("(2) *x == %d, y=%d \n",*x,y); // 9, 25
        return (*x+y); // 34
    }
    
    int G(int **x, int y){
        y = **x + y; // 43
        printf("(4) **x=%d, y=%d \n",**x,y); // 34, 43
        *x = &y; // u->v
        printf("(5) **x=%d, y=%d \n",**x,y); // 43, 43
        return (**x + y + 3); // 89
    }
    
    int main(){
        int v=2, t=5, *u;
        u=&t; // u->t
        t=5;
        *u=*u +v; // t = 7
        printf("(1) v= %d, t=%d, *u=%d \n",v, t, *u); // 2, 7, 7
        t=F(&v,t); // t = 34, v = 9, t = 7
        printf("(3) v= %d, t=%d, *u=%d \n",v, t, *u); // 9, 34, 34
        *u=G(&u,v); // u->v, v = 89
        printf("(6) v= %d, t=%d, *u=%d \n",v, t, *u); // 89, 34, 89
        return 0;
    }
    Je me suis fait avoir aussi, mais je me suis posé la question en croisant la ligne "*u = &y;" de la fonction G car tu assignes une adresse d'une variable qui n'en a pas. Le passage de paramètre d'une fonction se fait par copie au travers d'un registre (donc pas d'adresse), ou bien par la "pile" (son adresse n'est valide que le temps de vie de la fonction). Si tu veux mon avis, le fait que l'adresse pointée par u contient toujours la valeur 43 (donc la valeur qui se trouvait à l'adresse pointée par y) est un coup de chance, et écrire à l'adresse pointée par u après la fonction G est très dangereux puisque tu vas écrire n'importe où dans la pile, et donc écraser une autre variable "automatique"

  3. #3
    axou8

    Re : Problème lecture de code en C

    OK je vois, c'est donc le fait que l'adresse de y n'existe plus à la fin de la fonction G qui pose le problème.

    Merci de ton aide!

Discussions similaires

  1. Réponses: 2
    Dernier message: 29/08/2015, 13h31
  2. probleme code sur microcontroleur ( code tres simple)
    Par Albert-cosmoff dans le forum Électronique
    Réponses: 16
    Dernier message: 14/03/2014, 03h55
  3. Lecture Atmega88 avec PonyProg..Code crypté?
    Par Flastick dans le forum Électronique
    Réponses: 4
    Dernier message: 09/07/2011, 12h54
  4. Réponses: 2
    Dernier message: 27/07/2005, 09h44