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 :

Question d'entretien d'embauche


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Programmeur PHP
    Inscrit en
    Août 2009
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Israël

    Informations professionnelles :
    Activité : Programmeur PHP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2009
    Messages : 244
    Par défaut Question d'entretien d'embauche
    Salut,
    Je dispose du code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    main()
    {
    int a[2][2][2] = { {10,2,3,4}, {5,6,7,8}  };
    int *p,*q;
    p=&a[2][2][2];
    *q=***a;
    printf("%d----%d",*p,*q);
    }
    Que cela est il censé afficher?
    en faite la reponse doit etre:
    Answer:
    SomeGarbageValue---1
    Mais quand j'execute, j'ai une erreur par raport au pointeur q.
    Une idée?
    Merci

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 496
    Billets dans le blog
    1
    Par défaut
    Oui, il faut allouer une zone mémoire sur laquelle pointe le pointeur. Le warning dit bien que le pointeur est utilisé sans être initialisé. Tu essayes donc (en faisant *q = ... ;) d'écrire à un endroit inconnu, sûrement protégé, et cela génère une erreur de segmentation.

    Il faut faire comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int main(void)
    {
        int a[2][2][2] = { {10,2,3,4}, {5,6,7,8}  };
        int *p,*q;
        p=&a[2][2][2];
        q = malloc( sizeof(int) );
        *q=***a;
        printf("%d----%d",*p,*q);
        return 0;
    }
    Quant à la sortie :
    • p est l'adresse du dernier élément du tableau, sa valeur est "aléatoire". --> p est l'adresse d'un élément qui est hors du tableau.
    • *q à même valeur que le premier élément du tableau, soit 10 (et non 1).

  3. #3
    Membre éclairé
    Homme Profil pro
    Programmeur PHP
    Inscrit en
    Août 2009
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Israël

    Informations professionnelles :
    Activité : Programmeur PHP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2009
    Messages : 244
    Par défaut
    Je suis daccord avec toi, seulement ce nést pas ce quíl y a d'ecrit ici (2eme question).

    Autre chose,
    Peux tu méxpliquer ce resultat stp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    main()
    {
    int i=5;
    printf("%d%d%d%d%d",i++,i--,++i,--i,i);
    }
    Answer:
    45545
    Merci

  4. #4
    Membre Expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Par défaut
    Citation Envoyé par IsraGab Voir le message
    Je suis daccord avec toi, seulement ce nést pas ce quíl y a d'ecrit ici (2eme question).

    Autre chose,
    Peux tu méxpliquer ce resultat stp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    main()
    {
    int i=5;
    printf("%d%d%d%d%d",i++,i--,++i,--i,i);
    }
    Cela dépendra de l'implémentation faite par le compilateur, personnellement je ne sais pas dire ce qui sera affiché.
    La raison est que à ma connaissance la norme C ne définit pas l'ordre d'interprétation des arguments passé à une fonction.

    La seule chose que je peux dire c'est que les opérateurs post-incrément et pré-incrément ont le comportement suivant:
    • i++ retourne la valeur de i avant l'incrémentation (i = 4, i++ met 5 dans i et retourne 4)
    • ++i retourne la valeur de i après l'incrémentation (i = 4, ++i met 5 dans i et retourne 5)

  5. #5
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2011
    Messages
    1 255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 255
    Par défaut
    Citation Envoyé par jabbounet Voir le message
    Cela dépendra de l'implémentation faite par le compilateur.

    A ma connaissance la norme C ne définit pas l'ordre d'interprétation des arguments passé à une fonction.
    En effet avec Visual C++ j'ai : 45555
    Je ne comprends pas du tout la logique du résultat !
    qu'on parte de la gauche ou de la droite.

    Mais la réponse de IsraGab, c'est clairement une interprétation de la droite vers la gauche)

  6. #6
    Membre éclairé
    Homme Profil pro
    Programmeur PHP
    Inscrit en
    Août 2009
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Israël

    Informations professionnelles :
    Activité : Programmeur PHP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2009
    Messages : 244
    Par défaut
    Mais la réponse de IsraGab, c'est clairement une interprétation de la droite vers la gauche)
    Peux tu expliquer stp?
    Merci.
    PS: Au fait, j'utilise VS2012 et j'ai exactement le resultat donné.

  7. #7
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 496
    Billets dans le blog
    1
    Par défaut
    Oups ! c'est le matin et ce n'avait pas fait attention qu'on affichait *p. Quel crédit accordes-tu à ce site ? Es-tu sûr que les réponses sont fiables ?

    p=&a[2][2][2] you declare only two 2D arrays, but you are trying to access the third 2D(which you are not declared) it will print garbage values.
    OMG, mais c'est tout bête : si ton tableau est de taille 2*2*2, et comme la numérotation commence a 0, tu ne peux pas aller plus loin que 1 dans les indices..... -__-

    *q=***a starting address of a is assigned integer pointer. Now q is pointing to starting address of a. If you print *q, it will print first element of 3D array.
    Je ne suis pas d'accord. q ne pointe pas vers le début du tableau, il pointe vers une adresse indéterminée. A cette adresse, on essaye de stocker la valeur a[0][0][0] soit 10.

    Citation Envoyé par mala92
    **a et ***a pointe quelque part.
    Euh.... Je m'avance peut-être mais a priori, je dirais que **a et ***a sont des éléments de ce tableau de tableaux de tableaux et que ***a est le premier élément de l'ensemble (10).

  8. #8
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2011
    Messages
    1 255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 255
    Par défaut
    Il faut voir "a" comme un tableau de 2*2*2 élements.
    Donc "a" est une adresse, voire même l'adresse du 1er élément.

    *a est le 1er éléments du tableau.
    **a et ***a pointe quelque part.

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

Discussions similaires

  1. question en entretien d'embauche
    Par fanototo dans le forum Entretien
    Réponses: 6
    Dernier message: 06/06/2014, 16h41
  2. [Android] HR interview questions - préparation entretien d'embauche
    Par azeer dans le forum Mon application mobile
    Réponses: 2
    Dernier message: 30/04/2013, 11h56
  3. Réponses: 71
    Dernier message: 28/03/2011, 11h48
  4. entretien d'embauche, questions
    Par chamamo dans le forum Entretien
    Réponses: 3
    Dernier message: 10/02/2011, 19h20
  5. Questions pour un entretien d'embauche
    Par CSharper dans le forum Entretien
    Réponses: 14
    Dernier message: 27/03/2008, 21h35

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