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 :

Renseignement sur le nom des fonctions


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    447
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 447
    Par défaut Renseignement sur le nom des fonctions
    Bonjour, je souhaiterai avoir un renseignement sur le nom des fonctions :
    par exemple si on a :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     int addition(int x,int y) 
    {
      printf("adresse de addition = %d \n\n", &addition); 
      printf("adresse de x = %d \n", &x);
      printf("adresse de y = %d \n", &y);
      return x + y; 
    }
    Le nom de la fonction est une adresse pourquoi cette adresse ne correspond pas à l'adresse de l'argument ici int x. Sur mon ordi l'adresse du nom de la fonction est : 4234688 mais l'adresse de l'argument int x est : 2271920.

    Je pensais que l'adresse du nom de la fonction était identique à l'adresse du premier argument de la fonction donc ici int x, mais ce n'est pas le cas. Est-ce que le nom de la fonction est un pointeur sur le premier argument de la fonction ?
    Peut-on accéder à la valeur du nom de la fonction (pas à son adresse dans la mémoire) en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf ("valeur de addition = %d \n",addition);
    Cette valeur devrait normalement correspondre à l'adresse du premier argument int x mais en faite la valeur de addition est identique à son adresse. Donc comment le compilo peut-il savoir qu'il faut aller à l'argument int x si les 2 adresses (celle du nom de la fonction et celle du premier argument int x) sont différente.
    A quoi correspond l'adresse du nom de la fonction ? Quelle relation y a t-il entre l'adresse du nom de la fonction et les adresses des arguments et : si on fait un schéma de mémoire ou est placé l'adresse du nom de la fonction et les 2 arguments de la fonctions.
    Comment le compilo peut-il accéder au argument de la fonction si l'adresse du nom de la fonction ne correspond pas au premier argument de celle-ci ?
    J'espère avoir était suffisamment claire merci par avance.

  2. #2
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Une fonction est stocké dans l'espace des fonctions, ces adresses ne sont théoriquement même pas comparable avec celles d'une variables.
    Un argument de fonction est une variable locale au corps de la fonction, elle est donc dans le segment mémoire nommé "pile".
    La fonction en elle-meme est dans le segment de code (segment complètement constant)

    Les pointeurs ne sont pas même pas convertibles entre eux, normalement.

    La seule chose que tu sais, c'est que pour struct et union, le premier champ est à la même adresse que la structure elle-même. (et que c'est aussi l'adresse de tous les champs d'une union).
    Mais cela quasiment n'a rien à voir avec ta question.

    Par ailleurs pour afficher une adresse, utilise %p (comme pointeur)

  3. #3
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 474
    Par défaut
    Plus prosaïquement, une fonction n'est pas un container : c'est une liste d'instructions à honorer. Le nom de la fonction se résout en un « pointeur de fonction » qui, lui, pointe le code exécutable en langage machine tel que produit par le compilateur. C'est directement à cette adresse que le micro-processeur va poursuivre son travail lorsque tu vas appeler la fonction.

    Par ailleurs, une fonction n'est pas en soi un type de données et ne peut pas être instanciée en plusieurs exemplaires comme le ferait avec une variable.

    Tu confonds probablement avec les structures qui, elles, sont des agrégats de plusieurs sous-variables réunies sous un seul type. L'adresse de la structure entière correspond donc à celle de son premier élément.

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    447
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 447
    Par défaut
    Merci beaucoup pour vos réponses qui m'aide à avoir une meilleur compréhension sur le fonctionement d'une fonction.
    Comment se fait-il que les info que vous m'avez donnés je ne les retrouve pas sur le net ou puis-je trouver un cours C qui explique ce qui se passe avec les fonctions comme vous me l'avez expliqué.

    Merci encore !

  5. #5
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Soit dans la norme, soit dans nos cours et tutoriels de formation pour apprendre la programmation C : http://c.developpez.com/cours/ .
    En fouillant, on doit trouver pas mal de chose sur cppreference.com (tout particulièrement dans langage)
    Ces explications en particulier sont liées au modèle mémoire du C (C memory model)

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    447
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 447
    Par défaut
    Merci pour ta réponse

  7. #7
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 474
    Par défaut
    Citation Envoyé par hbx360 Voir le message
    Merci beaucoup pour vos réponses qui m'aide à avoir une meilleur compréhension sur le fonctionement d'une fonction.
    Comment se fait-il que les info que vous m'avez donnés je ne les retrouve pas sur le net ou puis-je trouver un cours qui explique ce qui se passe avec les fonctions comme vous me l'avez expliqué.Merci encore !
    C'est malheureusement souvent le cas, même dans les cours scolaires : avec la meilleure volonté du monde, on ne peut pas penser forcément à toutes les approches possibles que les étudiants peuvent avoir d'un sujet donné et, souvent, certaines choses paraissent totalement implicites, voire être des axiomes.

    En ce qui concerne le C en particulier, c'est un langage qui est extrêmement proche du fonctionnement réel des microprocesseurs et qui épouse au mieux leur architecture globale. Du coup, il y a beaucoup de choses dont les origines sont purement techniques et essayer de les appréhender de manière académique, comme les mathématiques, n'est pas forcément la méthode la plus efficace.


    http://c.developpez.com/cours/
    http://c.developpez.com/telecharger/

  8. #8
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 766
    Par défaut
    Éventuellement : x86 calling conventions

Discussions similaires

  1. pointeurs sur les arguments des fonctions?
    Par brunoP dans le forum C
    Réponses: 3
    Dernier message: 14/05/2006, 18h11
  2. String pointant sur un nom de Fonction.
    Par YmYannick dans le forum MFC
    Réponses: 4
    Dernier message: 21/04/2006, 13h06
  3. Réponses: 5
    Dernier message: 06/04/2006, 11h46
  4. [xpath] Requête sur le nom des attributs sans casse
    Par fedfil dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 30/01/2006, 10h58
  5. Réponses: 2
    Dernier message: 04/10/2005, 15h13

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