Dépitée par des pointeurs... [Résolu]

Signaler
-
 BonuxDu13 -
Bonjour,
je ne vois pas ce que j'ai fait de travers pour que mon compilateur m'insulte :



#include <stdio.h>
#include <stdlib.h>
void f(char* ptr);
int main(void)
{
char* pointeur = "ko";
f(pointeur);
printf("après la fonction, le pointeur vaut %s", pointeur);
return 0;
}
void f(char* ptr)
{
printf("dans la fonction vaut : %s\n", ptr);
  • ptr = "ok";

}



et ben ça me met pour l'avant dernière ligne "make integer from pointer without a cast"



Meme warning avec une déclaration par tableau :



#include <stdio.h>
#include <stdlib.h>

void f(char *ptr);
int main(void)
{
char pointeur[] = "ko";
f(pointeur);
printf("apres la fonction, le pointeur vaut %s\n", pointeur);
return 0;
}
void f(char *ptr)
{
printf("dans la fonction pointeur vaut : %s\n", ptr);
  • ptr = "ok";

}



Et si je met ptr = "ok" à l'avant dernière ligne, là ça compile, mais voilà le résultat :


dans la fonction pointeur vaut : ko
apres la fonction, le pointeur vaut : ko




Pas vraiment ce que j'attendais...

Configuration: Windows / Firefox 79.0

4 réponses

Messages postés
5403
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
18 septembre 2020
897
Salut bonuxdu13,

Quand tu postes du code, utilise les balises de code du forum, sinon c'est illisible.

https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

Tu commets plusieurs erreurs :
  • en C
    char * pointeur = "ko";
    réserve juste une taille mémoire permettant à
    pointeur
    de stocker une adresse vers quelque chose de type char, et affecte à cette adresse l'adresse vers un emplacement mémoire où se trouve une constante littérale que tu as définie dans le
    main()
    de ton code, d'une taille de 3 char formée par la chaîne C "ko" avec le caractère terminal
    '\0'
    ...
  • tu ne peux pas modifier le contenu de cet espace mémoire, car c'est une constante littérale
  • tu peux par contre éventuellement modifier l'adresse mémoire contenue dans
    pointeur
    pour désigner un autre espace mémoire
  • c'est ce que tu ferais en faisant
    ptr = "ok";
  • cependant, si tu ne le fais pas dans le même scope que
    main()
    , ta modification d'adresse ne sera pas vue de
    main()
    ...


Dans ta fonction si tu fais
*ptr = "ok";
tu as un warning qui t'alerte sur un conflit de types.

En effet, si
ptr
est de type
char *
alors en écrivant
*ptr
tu déréférences le pointeur sur char et cette expression est évaluée par le C à un
char
(ici
'o'
).

Comme le type
char
est un type entier (représentant son code ASCII, pour simplifier) et que tu essayes d'affecter à un type entier l'adresse vers un emplacement mémoire où se trouve une constante littérale d'une chaîne C que tu as définie dans le code de ta fonction et dont le type est
char *
, tu as l'erreur :

warning: assignment to ‘char’ from ‘char *’ makes integer from pointer without a cast [-Wint-conversion]


Ton deuxième code renvoie le même avertissement pour exactement la même raison.

En revanche, tu peux le faire fonctionner en utilisant les fonctions de copie prévues par le C
strcpy()
,
strncpy()
, ou
snprintf()
(ou en copiant les
char
successivement si cela te plaît), en t'assurant que la chaîne que tu copies ne dépasse pas l'espace mémoire alloué.

Vois ton manuel sur ces fonctions.

Dal
>
Messages postés
12265
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
20 septembre 2020

comment on fait?
Messages postés
5403
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
18 septembre 2020
897 > BonuxDu13
Il faut être inscrit pour pouvoir mettre la discussion en "résolu".
Messages postés
6
Date d'inscription
lundi 24 août 2020
Statut
Membre
Dernière intervention
26 août 2020
>
Messages postés
5403
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
18 septembre 2020

ben le truc c'est que je me suis inscrite et en me connectant, pas d'apparition de boutons supplémentaires chez moi
Messages postés
12265
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
20 septembre 2020
692 >
Messages postés
6
Date d'inscription
lundi 24 août 2020
Statut
Membre
Dernière intervention
26 août 2020

tu es inscrit maintenant, mais tu n'as pas créé cette discussion, donc tu ne peux pas la cloturer.
tu pourras clôturer les discussions que tu crées en étant inscrit.
>
Messages postés
12265
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
20 septembre 2020

ok, merci
en fait le pointeur marche à l'aller et pas au retour donc
Messages postés
12265
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
20 septembre 2020
692
bonjour, tu exprimes ton sentiment par rapport aux pointeurs.
je me demande ce que les pointeurs pensent de toi.
yg_be j'irai leur demander mais ils ont un problème de retour avec moi alors je sais pas si je le saurai :D
Merci pour ta réponse détaillée. C'est bizarre parce que si je fais ce code avec des entiers, ça compile et l'effet de bord de la fonction est présent :


#include <stdio.h>
#include <stdlib.h>

void f(int* ptr);
int main(void)
{
    int pointeur = 1;
    f(&pointeur);
    printf("apres la fonction, le pointeur vaut %d\n", pointeur);
    return 0;
}
void f(int* ptr)
{
    printf("dans la fonction pointeur vaut : %d\n", *ptr);
    *ptr = 2;
}



le résultat : dans la fonction pointeur vaut : 1
après la fonction, le pointeur vaut : 2


J'étais partie de l'idée qu'un argument passé par adresse devait fournir cet effet de bord quelque soit le type de la variable mise sous pointeur...
je vais aller potasser les quelques fonctions de copie que tu m'as donné.