FORUM Syndrome-OC - Jacky-PC


  Programmation


  Langage haut niveau(C, Pascal...)


  Effacer la mémoire alloué à un pointeur (char)

 




guy68 Overclocking : boxinwood Le salon de discussion : bbtoff, 2 utilisateurs anonymes et 19 utilisateurs inconnus

 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Effacer la mémoire alloué à un pointeur (char)

n°4117
Deather2
OpenBSD: the way to go!
Posté le 25-09-2004 à 13:00:20  profilanswer
 

Bonjour,
j'ai quelques soucis de Segfault avec mes pointeurs :/
Je crée le pointeur:

Code :
  1. char* Buffer = NULL;


je lui alloue de la mémoire:

Code :
  1. if((Buffer = (char*)malloc(256*sizeof(char))) == NULL)
  2. {
  3.  perror("No enough memory to initialise data!\n" );
  4.  exit(1);
  5. } else {
  6.  printf("Pointer created\n" );
  7. }


Et là je voudrais créer une fonction qui efface son contenu, j'ai donc fais:

Code :
  1. memset(Buffer,0x0,256);


 
Et là il fais le Segfault :/
Je comprend pas vraiment pourquoi, alors si vous aviez des suggestions ça serait sympa :)
 
Merci ;)

mood
Google
Posté le 25-09-2004 à 13:00:20  profilanswer
 

n°4118
Deadog
Dain Bramaged
Posté le 25-09-2004 à 13:01:36  profilanswer
 

if((Buffer = (char*)calloc(256, sizeof(char))) == NULL)  
 
 
et ton char* sera propre ;)


Message édité par Deadog le 25-09-2004 à 13:01:58
n°4120
Deather2
OpenBSD: the way to go!
Posté le 25-09-2004 à 13:07:30  profilanswer
 

ok j'ai fais ça, mais ça change rien à mon pb, tjrs le segfault :/

n°4121
Deadog
Dain Bramaged
Posté le 25-09-2004 à 13:25:10  profilanswer
 

bah ne fait pas le memset ! lol
 
man calloc si tu veux comprendre ...

n°4122
Deather2
OpenBSD: the way to go!
Posté le 25-09-2004 à 13:37:37  profilanswer
 

Euh wé mais j'ai besoin d'effacer ce buffer plusieurs fois dans le programme, donc il me faut le memset :/ (Désolé j'ai pas précisé)

n°4123
xDiamant
Posté le 25-09-2004 à 13:47:51  profilanswer
 

slt :
-----
 
Ton memeset est dans une autre fonction ? c'est a dire tu passe en argument le pointeur ? ou le memeset est dans la fonction qui a declaré ta variable ?
Sinon ben le pb vient de memset(Buffer,0,256) !!
le type de donnée que memset attend est du type (void *) donc ton char crash !
 
fait memset((char*)Buffer,0,256); et tout rentre dans l'autre
:)
 
bye


Message édité par xDiamant le 25-09-2004 à 13:55:11
n°4124
Deather2
OpenBSD: the way to go!
Posté le 25-09-2004 à 13:52:32  profilanswer
 

dans la fonction où ma variable est déclarée ;)

n°4125
xDiamant
Posté le 25-09-2004 à 13:56:04  profilanswer
 

Arf merde le temps que je corrige le post tu es passé :( donc relit mon poste et ca ira  
 
Bye

n°4126
Deather2
OpenBSD: the way to go!
Posté le 25-09-2004 à 13:58:45  profilanswer
 

Tu me dis qu'il attend un void et tu le cast en char ?
J'ai essayé les deux types de cast et le problème est le même :/

n°4127
xDiamant
Posté le 25-09-2004 à 14:12:34  profilanswer
 

Ben merde alors  :sleep:  
tu as le code complé car ca doit venir d'autre part car moi ca fait rien du tout enfin ca marche quoi.
 
Bye

n°4128
Deadog
Dain Bramaged
Posté le 25-09-2004 à 14:24:30  profilanswer
 

pkoi veux tu l'effacer intégrallement ?
 
fait un Buffer[0] = 0 [:spamafote]
 
à moins que tu n'utilises pas ton char * comme une chaine de caractère

n°4129
Deather2
OpenBSD: the way to go!
Posté le 25-09-2004 à 14:41:27  profilanswer
 

Voici le code source complet:
http://imaga.zapto.org/deather/FtpClient.c
 
En fait, j'établi une connection à un FTP (il est sur mon réseau, donc ça marchera pas pour vous, il suffit de changer l'IP ;))
Ensuite je reçois le message de bienvenue dans Recv_Buffer:
220 Blablablablablablablabla
 
j'écrit "SYST" dans le Send_Buffer puis je l'envoie, ensuite je recois la réponse dans Recv_Buffer:
215 UNIX Type: L8
lablablablablabla
 
En fait tout ce qui suit 215 UNIX Type: L8 n'a pas été effacé et est donc encore dans la mémoire, et le printf l'affiche :(
Je voudrais donc effacer en entier la mémoire ;)
 
J'espère que vous avez compris :p
 
au passage j'ai un autre pb, il fais aussi un segfault sur les deux free() de la fin :fou:
 
C'est chiant les pointeurs et les chaînes de caractères :o

n°4130
xDiamant
Posté le 25-09-2004 à 15:01:06  profilanswer
 

Re:  
----
 
pas de pb en particulier sur la mémoire.
 
erreur sur la fonction de reception qui est du type void et tu as un return ?
 

Code :
  1. void ReceiveData(int Socket,char *Buffer)
  2. {
  3. recv(Socket,Buffer,256,0);
  4. return Buffer;
  5. }


 
 
Ensuite pourkoi tu fait un bind() ? y'en a pas besion pour ce que tu fait.
 
 
Tu ecrit deux fois le port, un fois avec 21(FTP) et apres 0 ??
ServAddr.sin_port = htons(21);
puis  
LocalAddr.sin_port = htons(0);
 
pas de pb pour moi sur les pointeurs apres modif
 
Pour le pb d'affichage tu fait dans ta fonction de reception
 

Code :
  1. void ReceiveData(int Socket,char *Buffer)
  2. {
  3. Buffer[recv(Socket,Buffer,256,0)] = '\0';
  4. }


 
voila sinon voici le code client FTP avec utilisation de la class FTP perso

Code :
  1. void Connect_Ftp(char *Serveur, unsigned Port)
  2. {
  3. class ftp *Ftp = new ftp;
  4. if(Ftp->FindServeur(Serveur))
  5. {
  6.  if(Ftp->Connect_Client_PI(Port))
  7.  {
  8.   char Buff[5001]="";
  9.   /* Connexion Ok */
  10.   /* lit le message de bienvenu */
  11.   Ftp->GetReply_Client_PI(Buff,5000);
  12.   /*
  13.   220-FTP server ready.
  14.   220-You are user number 84 of 300 allowed.
  15.   220 Only anonymous FTP is allowed here
  16.   */
  17.   Ftp->SendCmd_Client_PI("USER anonymous\r\n" );
  18.   Ftp->GetReply_Client_PI(Buff,5000);
  19.   // -> 230 Anonymous user logged in
  20.   if(Ftp->GetReplyCode(Buff) == 230)
  21.   {
  22.    /* Demande au serveur d'avoir un canal de data */
  23.    Ftp->SendCmd_Client_PI("PASV\r\n" );
  24.    Ftp->GetReply_Client_PI(Buff,5000);
  25.    // -> 227 Enter passive mode (194,158,99,22,153,6)
  26.    if(Ftp->GetReplyCode(Buff)==227)
  27.    {
  28.     /* le serveur vien de donner le port */
  29.     /* connect le client DI sur le port */
  30.     if(Ftp->Connect_Client_DI(Buff))
  31.     {
  32.      /* envoi la commande sur le canal de control */
  33.      Ftp->SendCmd_Client_PI("LIST -al\r\n" );
  34.      Ftp->GetReply_Client_PI(Buff,5000);
  35.      // -> 150 accepted data connexion  
  36.      if(Ftp->GetReplyCode(Buff)==150)
  37.      {
  38.       /* ok la commande a etait effectuée par le serveur_DI */
  39.       /* lecture de la liste de fichier sur le canal de données */
  40.       Ftp->GetReply_Client_DI(Buff,5000);
  41.       /*
  42.       drwxr-xr-x    6 0        0            4096 Mar 11  2004 .
  43.       drwxr-xr-x    6 0        0            4096 Mar 11  2004 ..
  44.       -rw-r--r--    1 0        0            1013 Mar 11  2004 .banner
  45.       drwxrwxrwx    6 0        0            4096 Sep 25 13:00 .snapshot
  46.       -rw-r--r--    1 0        0            1142 Oct 21  2002 banner.html
  47.       drwxrwx-wx    3 501      501         28672 Sep 24 21:23 incoming
  48.       lrwxrwxrwx    1 0        0              11 May 18  2000 mirrors -> pub/mirrors
  49.       d-wx--x--x    6 502      1            4096 Mar 17  2004 private
  50.       drwxr-xr-x    7 502      1            4096 Sep 25 05:08 pub
  51.       */
  52.      }
  53.      /* En // le serveur PI a envoyé sur le canal de control
  54.       un compte rendu */
  55.      Ftp->GetReply_Client_PI(Buff,5000);
  56.      /*
  57.      226-Options: -a -l
  58.      226 9 matches total
  59.      */
  60.      /* ferme le canal de données. De tout facon le serveur
  61.      l'a deja fermé de son coté apres l'execution de la commande LIST */
  62.      Ftp->Close_Client_DI();
  63.     }
  64.     else printf("Erreur de connection au serveur DI" );
  65.    }
  66.    /* quit le serveur */
  67.    Ftp->SendCmd_Client_PI("QUIT\r\n" );
  68.    Ftp->GetReply_Client_PI(Buff,5000);
  69.    /*
  70.    221-Goodbye. You uploaded 0 and downloaded 0 kbytes.
  71.    221 Logout - CPU time spent: 0.004 seconds.
  72.    */
  73.    /* Ferme la connexion  de notre coté */
  74.    Ftp->Close_Client_PI();
  75.   }
  76.  }
  77.  else
  78.   printf("Impossible de se connecter a l'host distant" );
  79. }
  80. else
  81.  printf("Impossible de resoudre le Nom ou l'IP" );
  82. /* suprime la class */
  83. delete Ftp;
  84. }


 
Le tuto qui va avec est fait en premiere version
 
Si je peut avoir un acces a un serveur pout te donnée le tuto+code ..
 
Toujours sur le chat de cours-info
 
Bye


Message édité par xDiamant le 25-09-2004 à 15:28:39
n°4131
CryoGen
Powered by kitkat©
Posté le 25-09-2004 à 16:09:40  profilanswer
 

pour effacer un buffer y'a "bzero (buffer, BUFSIZE);"


---------------
I am the bone of my sword...
n°4132
Deather2
OpenBSD: the way to go!
Posté le 25-09-2004 à 16:33:22  profilanswer
 

C'est ce que je cherchais, et ça marche! Merci merci ! :)

n°4134
Deadog
Dain Bramaged
Posté le 25-09-2004 à 18:04:18  profilanswer
 

bzero est donnée comme déprécié
et à la place il faut utiliser ... memset :d
[:spamafote]

n°4135
Deather2
OpenBSD: the way to go!
Posté le 25-09-2004 à 18:21:19  profilanswer
 

Rah merde :o
:cry:

n°4136
Deadog
Dain Bramaged
Posté le 25-09-2004 à 18:25:10  profilanswer
 

j'ai pas trop le temps de regarder ton code
essaye ton programme avec la libefence

n°4141
Deather2
OpenBSD: the way to go!
Posté le 25-09-2004 à 19:00:35  profilanswer
 

c'pas grave, mon pb est résolu, et en plus xDiamant m'a filé son API pour FTP :) :love:

n°4143
xDiamant
Posté le 25-09-2004 à 21:36:07  profilanswer
 

re :
----
 
C bon tu as suivit le code et le tuto ? dit moi ce que tu en pence. Les point a appuyer, enfin les modif quoi juste avant de le mettre en ligne.
 
Sinon pour les pointeurs va sur cours-info.net j'ai fait un tuto sur les pointeurs qui a eclairci pas mal de mondes.(bon ok je fait de la pub mais bon)
 
Heureux peut etre de t'avoir aidé
 
Bye


Message édité par xDiamant le 25-09-2004 à 21:36:47
n°4144
Deather2
OpenBSD: the way to go!
Posté le 25-09-2004 à 22:03:36  profilanswer
 

Salut,
J'ai pas encore lu ton tuto, j'ai essayé de l'ouvrir avec OOo mais il m'as dis que le fichier était corrompu et j'ai pas eu le temps de regarde les autres fichiers, je verrais dès que je l'aurai (le temps) ;)
 
Je te tien au courant sur IRC :) À+ et merci ;)

mood
Google
Posté le 25-09-2004 à 22:03:36  profilanswer
 


Aller à :
Ajouter une réponse

  FORUM Syndrome-OC - Jacky-PC


  Programmation


  Langage haut niveau(C, Pascal...)


  Effacer la mémoire alloué à un pointeur (char)

 

Hit Parade