Dépitée par des pointeurs...

Résolu/Fermé
bonuxdu13 - 31 juil. 2020 à 17:03
 BonuxDu13 - 28 août 2020 à 18:55
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

[Dal] Messages postés 6193 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 4 juillet 2024 1 090
Modifié le 31 juil. 2020 à 18:53
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
1
J'ai rajouté un strcpy dans la fonction comme tu le suggérais et ça a marché, le résultat est bien "dans la fonction pointeur vaut : ko
après la fonction, le pointeur vaut : ok

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

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


Je te remercie beaucoup!
0
yg_be Messages postés 23235 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 30 septembre 2024 1 538 > bonuxdu13
20 août 2020 à 14:10
peux-tu alors marquer la discussion comme résolue?
0
BonuxDu13 > yg_be Messages postés 23235 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 30 septembre 2024
22 août 2020 à 17:34
comment on fait?
0
[Dal] Messages postés 6193 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 4 juillet 2024 1 090 > BonuxDu13
Modifié le 25 août 2020 à 13:26
Il faut être inscrit pour pouvoir mettre la discussion en "résolu".
0
BonuxDu13 Messages postés 13 Date d'inscription lundi 24 août 2020 Statut Membre Dernière intervention 12 juillet 2021 > [Dal] Messages postés 6193 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 4 juillet 2024
26 août 2020 à 09:13
ben le truc c'est que je me suis inscrite et en me connectant, pas d'apparition de boutons supplémentaires chez moi
0
en fait le pointeur marche à l'aller et pas au retour donc
0
yg_be Messages postés 23235 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 30 septembre 2024 Ambassadeur 1 538
31 juil. 2020 à 19:45
bonjour, tu exprimes ton sentiment par rapport aux pointeurs.
je me demande ce que les pointeurs pensent de toi.
0
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
0
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é.
0