un ptit truc tout con mais qui plante, pourquoi ?(pointeur) - C++ - Programmation
Marsh Posté le 18-03-2003 à 20:51:13
Quand tu écrits : "char * s1;", tu déclares un pointeur (donc une adresse en mémoire) sur une chaîne de caractères. Mais sans savoir à priori (tant que tu ne l'as pas initialisé) où il pointe.
Quand tu cherches à écrire à cette adresse, il y a de fortes chances pour que tu n'ais pas le droit d'y écrire. Forcément, ca plante
Marsh Posté le 18-03-2003 à 20:54:32
mrBebert a écrit : Quand tu écrits : "char * s1;", tu déclares un pointeur (donc une adresse en mémoire) sur une chaîne de caractères. Mais sans savoir à priori (tant que tu ne l'as pas initialisé) où il pointe. |
ok et pour remedier a ca, je dois faire quoi ?
Marsh Posté le 18-03-2003 à 20:58:16
Faire en sorte que ton pointeur pointe vers une adresse valide.
Pour allouer une zone mémoire, tu as la fonction malloc(taille);
Elle fait en sorte de réserver une zone mémoire de la taille voulue et te renvoie le pointeur :
char *s1;
int j;
s1 = malloc(50); // on réserve 50 octets
printf("entrez une chaine : " );
scanf("%s", s1);
Sinon, tu peux récupérer l'adresse d'une variable :
int i;
int *ptr;
i = 1;
ptr = &i; // ptr pointe sur i
*ptr = 2; // i vaut maintenant 2
edit : pour scanf, il faut passer un pointeur. s1 est déja un pointeur, il faut donc écrire scanf("%s", s1); et pas scanf("%s", &s1);
Sinon, tu récupère l'adresse du pointeur, ayant le type char **
Marsh Posté le 18-03-2003 à 21:06:08
mrBebert a écrit : Faire en sorte que ton pointeur pointe vers une adresse valide. |
C'est l'enseignement moderne d'apprendre à un débutant dès le départ à faire des overflows ?
C'est très à la mode, mais je ne suis pas convaincu que se soit vraiment un truc super-utile.
Marsh Posté le 18-03-2003 à 21:08:39
pas la peine de faire de malloc/free
Code :
|
et il manque un return 0; à la fin de ton main
Marsh Posté le 18-03-2003 à 21:09:43
nraynaud a écrit : |
propose moi une soluce alors..
Marsh Posté le 18-03-2003 à 21:15:34
swich a écrit : |
Taz vient de le faire (à peine mieux au niveau fonctionnel, mais au moins y'a pas de pb de mémoire).
Le pb en C c'est qu'il n'y a de base aucune fonction de haut niveau, donc t'est obligé dans ton cas d'écrire à la main une fonction qui va rallonger le buffer en fonction de la taille de la saisie (alors qu'en tant que débutant ce qui t'intéresse c'est de foutre une ligne dans un tableau de char, pas d'attaquer tout de suite ce genre de conneries).
Si t'as envie de rentrer dans du bizzare, il y a %ns (de mémoire) dans la glibc qui fait le malloc tout seul (à toi de désallouer à la main).
Marsh Posté le 18-03-2003 à 21:24:03
nraynaud a écrit : C'est l'enseignement moderne d'apprendre à un débutant dès le départ à faire des overflows ? |
Le but, c'était juste de montrer ce que faisait la fonction malloc et de montrer où ca devrait s'insérer dans son programme
Marsh Posté le 18-03-2003 à 21:31:12
mrBebert a écrit : Le but, c'était juste de montrer ce que faisait la fonction malloc et de montrer où ca devrait s'insérer dans son programme |
je dois commencer a voir les pointeurs, je sais qu'on peut le faire autrement cet exo, mais ici je voulais des pointeurs...
Merci tout le monde pour l'aide apportee
Marsh Posté le 18-03-2003 à 21:31:40
nraynaud a écrit : |
nraynaud a écrit : |
Tous ceux qui te connaissent ici connaissent aussi ton aversion profonde pour le C. Ceci dit, ce n'est pas une raison pour en dégouter les autres ou pour faire des réflexions gratuites qui n'apportent rien...
Marsh Posté le 18-03-2003 à 21:40:15
Harkonnen a écrit : |
Je suis pourtant le seul à avoir pointé explicitement la connerie du code de mrBebert (Taz l'a fait implicitement).
D'autre part, en dehors de l'ironie sur les méthodes d'apprentissage et la mode ravageuse des conneries avec la mémoire, tout ce que j'ai dit est purement factuel.
Marsh Posté le 18-03-2003 à 21:42:55
Harkonnen a écrit : |
bien dit
Marsh Posté le 18-03-2003 à 21:45:21
nraynaud a écrit : |
je suis d'accord avec toi.
Marsh Posté le 18-03-2003 à 21:52:10
nraynaud a écrit : |
Je suis d'accord sur le fond, mais pas sur la forme. Il aurait été plus utile de donner une explication du style "Attention ! Ce code peut planter dans le cas ou tu saisis plus de 50 caractères" et de mettre la correction ensuite plutot que de critiquer Bebert.
Marsh Posté le 18-03-2003 à 21:58:46
Harkonnen a écrit : |
Chacun son truc, je préfère que bebert ne donne plus jamais de code foireux à des débutants que moi donner un code que je n'ai pas la possibilité de tester, sachant que quelqu'un d'autre le fera avec du code un peu plus testé.
D'autre part c'est au delà de 49 caractères que ça chie (langage de merde où il faut réfléchir avant de dire ou écrire le moindre truc parce qu'il y a des pièges à con partout)
Merci pour la perche.
Marsh Posté le 18-03-2003 à 21:59:58
nraynaud a écrit : D'autre part c'est à partir de 49 caractères que ça chie (langage de merde où il faut réfléchir avant de dire ou écrire le moindre truc parce qu'il y a des pièges à con partout) |
Marsh Posté le 18-03-2003 à 22:02:12
La violence de résout rien .... (d'ailleur j'avait fait une petite erreur de formulation)
Marsh Posté le 18-03-2003 à 22:03:09
nraynaud a écrit : Je suis pourtant le seul à avoir pointé explicitement la connerie du code de mrBebert (Taz l'a fait implicitement). |
Je rappelle que la question à la base, c'est "comment faire pour avoir un pointeur qui pointe vers quelque chose"
Désolé, mais sur un forum, je réponds au question, je suis pas là pour balancer ma science. Oui y a un risque de débordement, oui je n'ai pas vérifié le résultat du malloc, oui y avait plus simple.
Mais ca ne sert à rien de déblatérer sur les problèmes de débordement, ou de fuites mémoires ou autre si la personne qui pose la question ne sait même pas comment allouer de la mémoire. Faudrait voir à commencer par le début
Evidemment que les quelques lignes de code peuvent bugger, mais elle sont là pour montrer l'enchainement nécessaire pour utiliser des pointeurs. Et c'est ce que voulait l'auteur du topic il me semble.
Il débuggera quand il comprendra ce qui se passe, et pas l'inverse
Evidemment, c'est toujours plus facile de critiquer que de proposer quelque chose facilement compréhensible par un débutant
Marsh Posté le 18-03-2003 à 22:11:23
waouuuu
ce devie toujours comme ca qd y'a une question sur le C ?
Marsh Posté le 18-03-2003 à 22:13:57
mrBebert a écrit : Je rappelle que la question à la base, c'est "comment faire pour avoir un pointeur qui pointe vers quelque chose" |
Excuse-moi, je croyait qu'il voulait saisir une chaîne de caractères et en mesurer la longueur, je me traîne un crétinisme ces temps-ci, ça doit être les coup de soleil de se week-end, ou la bouffe d'ici.
Par contre, je remarque que toi tu l'a traîné sur des pointeurs, une sorte de manière de ramener ta science sans savoir s'il avait eu une introduction à la bête.
edit : effectivement, ça doit être le soleil, et un peu l'énervement de lire ce type de trucs aussi.
Marsh Posté le 18-03-2003 à 22:16:07
swich a écrit : waouuuu |
Non, le C++ aussi, les langages casse-gueule faut toujours au moins 3 réponses pour en savoir plus.
Marsh Posté le 18-03-2003 à 22:16:27
nraynaud a écrit : |
hmm reli un peu le debut du poste, c'est moi qui est demande des pointeurs
Marsh Posté le 18-03-2003 à 22:20:58
swich a écrit : |
bonne remarque, désolé pour le poste précédent.
Donc si c'est réellement pointeurs, c'est -surtout- gaffe aux bornes (90% du temps de débug, surtout au début).
edit : typo
Marsh Posté le 18-03-2003 à 22:23:27
nraynaud a écrit : |
Bon nraynaud, je ne le répeterais pas ! Sois tu fais de la provoc au second degré, auquel cas je te serais reconnaissant de mettre des smileys pour qu'il n'y ait aucune ambiguité, soit tu as vraiment le melon et là je peux te conseiller une cure d'humilité aigüe histoire de dégonfler cet immense bulbe. Quoi qu'il en soit, la prochaine réflexion condescendante de ce genre, et ce sera un séjour chez les TéléTubbies. A bon entendeur...
Marsh Posté le 18-03-2003 à 22:37:14
Harkonnen a écrit : |
note pour plus tard : vérifier qu'il est pas modo avant de reprendre quelqu'un.
Marsh Posté le 18-03-2003 à 22:47:17
nraynaud a écrit : |
Je ne t'empeche pas de reprendre qui que ce soit ! Je te reproche juste un ton très orgueilleux, et limite de prendre les gens pour des cons. Donc, si c'est du second degré, ça serait bien de le signaler par des smileys...
Marsh Posté le 18-03-2003 à 22:49:20
spa bientot fini vos chamailleries, toute façon smoi qui a la plus grosse
Marsh Posté le 18-03-2003 à 20:47:41
voila donc pour debuter les pointeurs, je voulais me faire un ptit exo qui permet de rentrer une chaine de caracteres et qui en renvoie la taille..
mais bon a l'execution ca plante, je vois pas pourquoi..