C fonction malloc et realloc, je comprend pas tout

C fonction malloc et realloc, je comprend pas tout - C++ - Programmation

Marsh Posté le 14-02-2003 à 11:52:21    

Code :
  1. char * EnterChar()
  2. {
  3.     char c;
  4.     char * s2;
  5.     char * str;
  6.     int buf=0;
  7.     str = (char *)malloc(buf*sizeof(char));
  8.    do
  9.      { 
  10.      
  11.         c = getchar();
  12. if(c!='\n')
  13.   {
  14.     *(str+buf)= c;
  15.     buf++;
  16.     str=(char *)realloc(str,sizeof(char)*buf);
  17.   }
  18.      }while( c != '\n');
  19.  
  20.  
  21.      
  22.    s2 = (char *)malloc(sizeof(char)*3);
  23.    *s2='\n';
  24.    *(s2+1)='\007';
  25.    *(s2+2)='\0';
  26.    str=strcat(str,s2);
  27.  
  28.    return str;
  29. }

 
 
voila le code
 
le truc qui me parait bizarre c'est qu au debut je fais un malloc à 0, donc normalment je n'alloue pas de mémoire, or le     *(str+buf)= c; passe bien  
 
de meme pour le    s2 = (char *)malloc(sizeof(char)*3);
 
en mettant 0 a la place de 3 il me crache rien a la gueule !
 
alors soit j ai rien capter, soit mon gcc buf  :pt1cable:  
 
et enfin un dernier teste que j ai effectue en faisant un realloc  
a seulement sizeof de char soit 1 otect, il me crache pas ds la geuele avant une 100aine de caractére  :lol:  
 
et enfin quand dans mon main je fais un sizeof de str il me dis 4octect or dans les conditions normales, si je rentre 7 caractéres plus les 3derniers ajouter du fait de l'enoncer de mon exo
alors qu'il devrait dire 10octets
bon la c'est discutable car je fais un sizeof d'un ponteur char donc c'est peut-étre ca le probléme (pas un bon teste)  
 
 
 
en gros  :pt1cable:

Reply

Marsh Posté le 14-02-2003 à 11:52:21   

Reply

Marsh Posté le 14-02-2003 à 11:55:15    

La protection mémoire ne se situe pas au niveau des variables, mais au niveau segments (d'ou le segmentation fault). Donc tu peux écrire à coté d'une variable sans que ça pête tant que tu restes dans un segment autorisé.
 
Fait ttourné ton programme dans un soft comme valgrind, tu vas te faire insulter.


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 14-02-2003 à 12:02:17    

kadreg a écrit :

La protection mémoire ne se situe pas au niveau des variables, mais au niveau segments (d'ou le segmentation fault). Donc tu peux écrire à coté d'une variable sans que ça pête tant que tu restes dans un segment autorisé.
 
Fait ttourné ton programme dans un soft comme valgrind, tu vas te faire insulter.


 
ah ok !
 
donc en fait c pas trés controler au niveau des variables c'est pour ca que je fais un peu n'importe koi ca marche quand meme
 
(c'est vrai ce qu'on m avait dit sur le c si tu fais n'inworte koi ca peut marcher, mais gare au degat)
 
et valgrind ca fais koi exactement !
ca controle en permanence l allocation mémoire pour chaque variable ?

Reply

Marsh Posté le 14-02-2003 à 12:02:50    

tu te rends copte que buf==0 au debut? donc la premiere allocation renvoie nNULL donc la premier fois ou tu fais *(str+buf), boum!
 
ensuite je ne comprends l'utilité de s2, surtout l'allocation dynamique tu peux faire strcat(str, "\n\007\0" ). prends bien soin d'allouer str de façon adequate pour stoquer ces 3 caracteres supplémentaires et surtout, n'oublie pas qu'il faut allouer 1 en plus pour le 0 final

Reply

Marsh Posté le 14-02-2003 à 12:06:53    

++Taz a écrit :

tu te rends copte que buf==0 au debut? donc la premiere allocation renvoie nNULL donc la premier fois ou tu fais *(str+buf), boum!
 
ensuite je ne comprends l'utilité de s2, surtout l'allocation dynamique tu peux faire strcat(str, "\n\007\0" ). prends bien soin d'allouer str de façon adequate pour stoquer ces 3 caracteres supplémentaires et surtout, n'oublie pas qu'il faut allouer 1 en plus pour le 0 final


 
1) ben oui justement ca marche c'est ce que je disais (ce qui m etonnait)
 
2) C'est le but de l exo, spo moi qui fait l'exo de C
 (vous utiliserez un 2ieme pointeurs s2 blablabla ) !!
 
c'est vrai pour le \0 lui par contre j avais compltement oublié !
 
 
je vais voir avec valgrind pour mieux controler tout ca !

Reply

Marsh Posté le 14-02-2003 à 12:10:11    

et alors?
"\n\007\0" c'est toujours utilisé via un pointeur dans une zone statique allouée à la compialtion
 
next-tip:
*(ptr+i) == ptr[i]

Reply

Marsh Posté le 14-02-2003 à 14:32:15    

++Taz a écrit :

et alors?
"\n\007\0" c'est toujours utilisé via un pointeur dans une zone statique allouée à la compialtion
 
next-tip:
*(ptr+i) == ptr[i]


 
la n'etait pas le probleme de toute facon

Reply

Marsh Posté le 14-02-2003 à 17:29:27    

kadreg :jap: pour le nom de ce prog qui m a permis de mieux comprendre et cette petite explication !
 
par contre taz++ avant de donner des conseilles fais la diférence entre = et ==
 
spo pareille ;)

Reply

Marsh Posté le 14-02-2003 à 17:49:23    

AsPHrO a écrit :

kadreg :jap: pour le nom de ce prog qui m a permis de mieux comprendre et cette petite explication !
 
par contre taz++ avant de donner des conseilles fais la diférence entre = et ==
 
spo pareille ;)

:heink:

Reply

Marsh Posté le 14-02-2003 à 18:51:13    

AsPHrO a écrit :

kadreg :jap: pour le nom de ce prog qui m a permis de mieux comprendre et cette petite explication !
 
par contre taz++ avant de donner des conseilles fais la diférence entre = et ==
 
spo pareille ;)


attention ++taz et taz++ c'est pas pareil  :D

Reply

Marsh Posté le 14-02-2003 à 18:51:13   

Reply

Marsh Posté le 14-02-2003 à 18:53:35    

gloop a écrit :


attention ++taz et taz++ c'est pas pareil  :D  


 
skoi la diff entre ++taz et taz++ ?
 
ca rend le même nombre pourtant !

Reply

Marsh Posté le 14-02-2003 à 18:55:55    

AsPHrO a écrit :


ca rend le même nombre pourtant !


 
Bah justement non :)


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 14-02-2003 à 18:57:06    

je crois que c'est toi qui comprends rien: j'ai absolument pas confondu = et ==
 
et ++taz, c'est bien mieux que taz++: ca vaut (taz+1) et toute logique et c'est plus performant (et ouais, faire une copie d'un taz, c'est lourd).
 
j'ai jamais compris pourquoi on emploi préférenciellement post++ au lieu de ++pre


Message édité par Taz le 14-02-2003 à 18:59:07
Reply

Marsh Posté le 14-02-2003 à 19:09:58    

kadreg a écrit :


 
Bah justement non :)


explike !

Reply

Marsh Posté le 14-02-2003 à 19:13:00    

c'est toi qui m'accuse alors dis moi ou j'aurais fait une erreur
pour etre plus precis j'aurais du dire (tab+i) == &(tab[i]))  => (*(tab+i) == tab[i])

Reply

Marsh Posté le 14-02-2003 à 19:13:12    

++Taz a écrit :

je crois que c'est toi qui comprends rien: j'ai absolument pas confondu = et ==
 
et ++taz, c'est bien mieux que taz++: ca vaut (taz+1) et toute logique et c'est plus performant (et ouais, faire une copie d'un taz, c'est lourd).
 
j'ai jamais compris pourquoi on emploi préférenciellement post++ au lieu de ++pre


 
entre une affection et un operateur booléen je crois qu il ya  une diff non ?
 
sinon kad :

Code :
  1. cat test.c
  2. int main()
  3. {
  4.   int a=0;
  5.   int b=0;
  6.   a++;
  7.     ++b;
  8.   printf("le a : %d , le b %d",a,b);
  9. }
  10. tropic root # ./test
  11. le a : 1 , le b 1


 
:??:
 

Reply

Marsh Posté le 14-02-2003 à 19:14:54    

++Taz a écrit :

c'est toi qui m'accuse alors dis moi ou j'aurais fait une erreur
pour etre plus precis j'aurais du dire (tab+i) == &(tab[i]))  => (*(tab+i) == tab[i])


 
oui j ai rien dis
 
ct une explication, je croyais ct un exemple !!

Reply

Marsh Posté le 14-02-2003 à 19:14:55    

AsPHrO a écrit :


sinon kad :
:??:


 

Code :
  1. int main()
  2. {
  3.   int a=0;
  4.   int b=0;
  5.   printf("le a : %d , le b %d",a++,++b);
  6. }


 
 :p


Message édité par kadreg le 14-02-2003 à 19:15:49

---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 14-02-2003 à 19:16:35    

AsPHrO a écrit :


 
entre une affection et un operateur booléen je crois qu il ya  une diff non ?
 
sinon kad :

Code :
  1. cat test.c
  2. int main()
  3. {
  4.   int a=0;
  5.   int b=0;
  6.   a++;
  7.     ++b;
  8.   printf("le a : %d , le b %d",a,b);
  9. }
  10. tropic root # ./test
  11. le a : 1 , le b 1


 
:??:
 
 


 
maintenant fait ca:

Code :
  1. int main ()
  2. {
  3.   int a=0;
  4.   int b=0;
  5.   printf("le a : %d , le b %d",a++,++b);
  6.   printf("le a : %d , le b %d",a,b);
  7. }


tu devrais comprendre la difference
 
edit: oups, le temps de téléphoner et grillé  :D


Message édité par gloop le 14-02-2003 à 19:18:04
Reply

Marsh Posté le 14-02-2003 à 19:18:06    

kadreg a écrit :


 

Code :
  1. int main()
  2. {
  3.   int a=0;
  4.   int b=0;
  5.   printf("le a : %d , le b %d",a++,++b);
  6. }


 
 :p


 
hu !
 
man google difference ++i i++
 

Reply

Marsh Posté le 14-02-2003 à 19:21:10    

bon google rend pas service !
 
vous voulez continuer a jouer ! ou on m'explique !

Reply

Marsh Posté le 14-02-2003 à 19:21:34    

AsPHrO a écrit :


 
oui j ai rien dis
 
ct une explication, je croyais ct un exemple !!


explciation ou exemple c'est toujours vrai...
 
 
 
y en a marre, je passe ma vie sur HFR et je suis toujours un parfait inconnu pour tous les programmeurs C et C++

Reply

Marsh Posté le 14-02-2003 à 19:24:26    

AsPHrO a écrit :

bon google rend pas service !
 
vous voulez continuer a jouer ! ou on m'explique !


bon une petite explication si tu comprends pas:
i++: incrémente i et retourne son ancienne valeur
++i: incrémente i et retourne sa nouvelle valeur
 
i++ est plus lent car pour retourner l'ancienne valeur il faut l'avoir copié, et dans le 2eme cas, y a pas de copie.
c'est + clair ?


Message édité par gloop le 14-02-2003 à 19:24:47
Reply

Marsh Posté le 14-02-2003 à 19:27:22    

++Taz a écrit :


explciation ou exemple c'est toujours vrai...
 
 
 
y en a marre, je passe ma vie sur HFR et je suis toujours un parfait inconnu pour tous les programmeurs C et C++


 
mais non c'est moi qui est mal lu !
 
j avais compris autre chose !
 
 
bon le coup du ++i i++ !
 
je me touche avec
 
théorie a la moi
 
i++
 
on fais i = i + 1
 
++i on fais
 
i + 1 = i
 
 :lol:

Reply

Marsh Posté le 14-02-2003 à 19:28:55    

gloop a écrit :


bon une petite explication si tu comprends pas:
i++: incrémente i et retourne son ancienne valeur
++i: incrémente i et retourne sa nouvelle valeur
 
i++ est plus lent car pour retourner l'ancienne valeur il faut l'avoir copié, et dans le 2eme cas, y a pas de copie.
c'est + clair ?


 
han ok
 
donc pkoi on voit enormement utiliser i++ que ++i !
 
même dans les cours etc ...
a chaque on noutre montre i++
 
nb: apres relecture j ai compris pkoi  
 et sur ceux je vais me recoucher car ma grippe, a gripper mon cerveau !


Message édité par asphro le 14-02-2003 à 19:31:01
Reply

Marsh Posté le 15-02-2003 à 00:59:38    

malloc peut faire des allocations de 0, il renvoie une adresse unique permettant d'identifier l'allocation.
Ça marche comme une allocation normale, realloc marche dessus, et il faut penser à appeler free dessus.
 
La mémoire est en général gérée par page, typiquement de 4 Ko.
Il y a donc de la marge avant que l'OS ne râle, et encore seulement si la page suivante n'est pas 'writable'.


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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