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 :

programmation c pointeur


Sujet :

C

  1. #1
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2022
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 23
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2022
    Messages : 22
    Points : 11
    Points
    11
    Par défaut programmation c pointeur
    salut, svp y a il quelqu'un qui peut m'aider à resoudre le probleme au niveau de la ligne 7 de ce preogramme? je comprend pas pourquoi il ya un probleme et merciiii!!!
    voici le programme;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include <stdio.h>
    #include <stdlib.h> 
    int main(){
    int y=12;
    int *a=NULL;
    y=20;
    *a=25;
    printf("l'adresse du pointeur a est:%p\n",&a);
    return 0;
    }

  2. #2
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Août 2008
    Messages
    26 675
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 26 675
    Points : 188 681
    Points
    188 681
    Par défaut


    Pour que l'on puisse t'aider plus facilement, l'idéal est d'écrire explicitement l'erreur que tu as, le problème que tu rencontres, etc. "Y'a un problème" n'est pas très clair ou précis .

    Dans ton cas, a est un pointeur vers une adresse mémoire invalide : comment veux-tu y écrire ? Tu dois y mettre une valeur sensée, par exemple l'une de ces lignes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    a = &y; // Toute modification à travers a se fera sur y
    a = malloc(sizeof(int)); // a pointe vers un nouvel espace en mémoire, indépendant des autres variables

  3. #3
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2022
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 23
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2022
    Messages : 22
    Points : 11
    Points
    11
    Par défaut
    voici l'erreur et désolée de ne pas avoir été attentive pour ce détail sinon merci beaucoup!!
    Images attachées Images attachées  

  4. #4
    Membre averti

    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2012
    Messages
    319
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2012
    Messages : 319
    Points : 346
    Points
    346
    Par défaut
    Oui c'est bien d'initialiser le pointeur "a" par NULL, par contre quand tu fais *a=25; c'est là que l'ordi te "crie dessus"... vu que "a" a une valeur indéterminée (NULL c'est pas 0 c'est "invalide/indéterminé").

    Comme disait dourouc05...

    Tu as deux possibilités pour initialiser ton pointeur soit tu passes l'adresse de "y" (d'une variable) comme avec a=&y; ou alors tu passes par la fonction malloc() mais, en général on utilise malloc() dans un autre contexte que celui d'initialiser un pointeur, on l'utilise pour "réserver" un certain espace
    en mémoire pour manipuler des données dont on ne connait pas la taille à l'avance. Et si nous voulions vraiment initialiser les valeurs à l'adresse obtenue via l'appel de cette fonction il vaudrait mieux passer par calloc... mais un calloc(1,sizeof(int)) n'a pas vraiment de sens.

    Si tu faisais dans ton main():

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     int y=12;
    int *a=&y;
     
    printf("Adresse de y: %p <-> %p\n",a,&y);
    printf("Adresse de a: %p\n",&a);
     
    printf("Valeur de y: %d\n",y);
     
    *a=120;
     
    printf("Valeur de y: %d\n",y);
    ...tu devrais voir une des multiples facettes des pointeurs qui sont, de loin, les mécanismes les plus puissants qui soient.

  5. #5
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2022
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 23
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2022
    Messages : 22
    Points : 11
    Points
    11
    Par défaut
    merci beaucoup à vous deux c'est si gentil de votre part! j'comprend mieu maintenant graçe à vous

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 726
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 726
    Points : 31 046
    Points
    31 046
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Il faut bien comprendre la différence dans ces deux écritures int *a=valeur vs *a=valeur. Les deux se ressemblent mais ne signifient pas la même chose (parce que le contexte n'est pas le même).
    Dans la première écriture, il s'agit d'une définition de pointeur plus affectation dans la foulée. L'affectation se fait donc sur le pointeur "a". C'est comme si tu écrivais int *a; a=valeur.
    Dans la seconde, tu as un pointeur "a" (qui contient une adresse) et tu veux mettre une valeur dans la case pointée, c'est à dire à cette adresse symbolisée par l'opération "étoile a". Tu ne peux faire cela que si l'adresse située dans "a" est une adresse...on va dire "officielle", c'est à dire une adresse qui correspond à quelque chose de valide.

    Or il n'y a que deux façons d'obtenir une adresse valide
    • récupérer l'adresse d'une autre variable => int x; int *a=&x => ok, la variable "x" existe et le pointeur "a" récupère son adresse => c'est valide
    • demander au système de t'allouer de la mémoire, via malloc(). Le système réserve alors une zone mémoire de la taille de ton choix et te donne son adresse, adresse que tu récupères dans ton pointeur

    Sans l'une ou l'autre de ces deux méthodes, il t'est interdit de tenter de mettre une valeur dans la case adressée par ton pointeur comme tu l'as fait.

    Il existe une 3° syntaxe qui permet d'obtenir une adresse valide, c'est l'adresse NULL, comme c'est le cas ici. C'est une adresse valide mais une adresse inutilisable. Ca sert quand on veut dire "je veux que mon pointeur soit initialisé mais je ne veux pas qu'il soit utilisable (du moins immédiatement). C'est donc une adresse valide mais ne représentant rien de concret dans la mémoire, une adresse en quelque sorte neutre. Et donc dans ce cas aussi tu n'as pas le droit de tenter de mettre une valeur à cette adresse car ce n'est pas réellement une adresse utilisable.

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

Discussions similaires

  1. Sous-programmes variables pointeurs et adresse
    Par neophyte_ingé dans le forum Débuter
    Réponses: 5
    Dernier message: 30/11/2016, 20h23
  2. Apprendre à programmer les pointeurs en C et en C++
    Par Community Management dans le forum C
    Réponses: 5
    Dernier message: 08/07/2016, 18h44
  3. Programmation C - Pointeurs et tableaux
    Par barzag dans le forum Débuter
    Réponses: 2
    Dernier message: 16/01/2013, 01h26
  4. Programme voiture pointeur et tableaux
    Par lilp1 dans le forum Débuter
    Réponses: 6
    Dernier message: 07/11/2010, 17h05
  5. Question de pointeur entre un programme et une DLL
    Par Neilos dans le forum C++Builder
    Réponses: 12
    Dernier message: 01/02/2005, 19h12

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