un ptit truc tout con mais qui plante, pourquoi ?(pointeur)

un ptit truc tout con mais qui plante, pourquoi ?(pointeur) - C++ - Programmation

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..
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main() {
  4. char * s1;
  5. int j;
  6. printf("entrez une chaine : " );
  7. scanf("%s",&s1);
  8. j=strlen(s1);
  9. printf("\n taille de la chaine 1 : %i",j);
  10. getch();
  11. }

Reply

Marsh Posté le 18-03-2003 à 20:47:41   

Reply

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 [:proy]


Message édité par mrbebert le 18-03-2003 à 20:53:05
Reply

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.
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 [:proy]


ok et pour remedier a ca, je dois faire quoi ?

Reply

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 ** :pt1cable:


Message édité par mrbebert le 18-03-2003 à 21:01:59
Reply

Marsh Posté le 18-03-2003 à 21:06:08    

mrBebert a écrit :

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);


 
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.


Message édité par nraynaud le 18-03-2003 à 21:07:53
Reply

Marsh Posté le 18-03-2003 à 21:08:39    

pas la peine de faire de malloc/free
 

Code :
  1. char buffer[128];
  2. scanf("%s", buffer);
  3. // ou mieux
  4. fgets(buffer, sizeof buffer, stdin);


 
 
et il manque un return 0; à la fin de ton main

Reply

Marsh Posté le 18-03-2003 à 21:09:43    

nraynaud a écrit :


 
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.


propose moi une soluce alors..
 

Reply

Marsh Posté le 18-03-2003 à 21:15:34    

swich a écrit :


propose moi une soluce alors..
 
 


 
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).

Reply

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 ?
C'est très à la mode, mais je ne suis pas convaincu que se soit vraiment un truc super-utile.

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 :o

Reply

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 :o  


 :jap:  
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 :)  [:yuck]

Reply

Marsh Posté le 18-03-2003 à 21:31:12   

Reply

Marsh Posté le 18-03-2003 à 21:31:40    

nraynaud a écrit :


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.


 

nraynaud a écrit :


Taz vient de le faire (à peine mieux au niveau fonctionnel, mais au moins y'a pas de pb de mémoire).  


 
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...


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 18-03-2003 à 21:40:15    

Harkonnen 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...


 
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.

Reply

Marsh Posté le 18-03-2003 à 21:42:55    

Harkonnen 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...


 
bien dit

Reply

Marsh Posté le 18-03-2003 à 21:45:21    

nraynaud 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.

je suis d'accord avec toi.

Reply

Marsh Posté le 18-03-2003 à 21:52:10    

nraynaud a écrit :


 
Je suis pourtant le seul à avoir pointé explicitement la connerie du code de mrBebert (Taz l'a fait implicitement).


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.


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 18-03-2003 à 21:58:46    

Harkonnen 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.


 
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.


Message édité par nraynaud le 18-03-2003 à 22:00:26
Reply

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)
 
Merci pour la perche.

[:tapai]


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

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)

Reply

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).
 
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.

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 :o  
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 :/  

Reply

Marsh Posté le 18-03-2003 à 22:11:23    

waouuuu
ce devie toujours comme ca qd y'a une question sur le C ?

Reply

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" :/  
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 :o  
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 :/  
 


 
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.


Message édité par nraynaud le 18-03-2003 à 22:22:06
Reply

Marsh Posté le 18-03-2003 à 22:15:29    

bougez pas, je vais chercher le popcorn [:dawa]

Reply

Marsh Posté le 18-03-2003 à 22:16:07    

swich a écrit :

waouuuu
ce devie toujours comme ca qd y'a une question sur le C ?
 


 
Non, le C++ aussi, les langages casse-gueule faut toujours au moins 3 réponses pour en savoir plus.

Reply

Marsh Posté le 18-03-2003 à 22:16:27    

nraynaud a écrit :


 
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.


hmm reli un peu le debut du poste, c'est moi qui est demande des pointeurs ;)

Reply

Marsh Posté le 18-03-2003 à 22:20:58    

swich a écrit :


hmm reli un peu le debut du poste, c'est moi qui est demande des pointeurs ;)
 


 
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


Message édité par nraynaud le 18-03-2003 à 22:23:05
Reply

Marsh Posté le 18-03-2003 à 22:23:27    

nraynaud a écrit :


 
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.


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...


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 18-03-2003 à 22:37:14    

Harkonnen a écrit :


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...
 


 
note pour plus tard : vérifier qu'il est pas modo avant de reprendre quelqu'un.

Reply

Marsh Posté le 18-03-2003 à 22:47:17    

nraynaud a écrit :


 
note pour plus tard : vérifier qu'il est pas modo avant de reprendre quelqu'un.


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...


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 18-03-2003 à 22:49:20    

spa bientot fini vos chamailleries, toute façon smoi qui a la plus grosse  [:the grosminet]

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed