Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1911 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  C fonction malloc et realloc, je comprend pas tout

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

C fonction malloc et realloc, je comprend pas tout

n°309179
asphro
Posté le 14-02-2003 à 11:52:21  profilanswer
 

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:

mood
Publicité
Posté le 14-02-2003 à 11:52:21  profilanswer
 

n°309180
kadreg
profil: Utilisateur
Posté le 14-02-2003 à 11:55:15  profilanswer
 

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 !
n°309190
asphro
Posté le 14-02-2003 à 12:02:17  profilanswer
 

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 ?

n°309192
Taz
bisounours-codeur
Posté le 14-02-2003 à 12:02:50  profilanswer
 

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

n°309196
asphro
Posté le 14-02-2003 à 12:06:53  profilanswer
 

++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 !

n°309198
Taz
bisounours-codeur
Posté le 14-02-2003 à 12:10:11  profilanswer
 

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]

n°309352
asphro
Posté le 14-02-2003 à 14:32:15  profilanswer
 

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

n°309777
asphro
Posté le 14-02-2003 à 17:29:27  profilanswer
 

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

n°309800
Taz
bisounours-codeur
Posté le 14-02-2003 à 17:49:23  profilanswer
 

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:

n°309870
gloop
Posté le 14-02-2003 à 18:51:13  profilanswer
 

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

mood
Publicité
Posté le 14-02-2003 à 18:51:13  profilanswer
 

n°309872
asphro
Posté le 14-02-2003 à 18:53:35  profilanswer
 

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 !

n°309874
kadreg
profil: Utilisateur
Posté le 14-02-2003 à 18:55:55  profilanswer
 

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 !
n°309875
Taz
bisounours-codeur
Posté le 14-02-2003 à 18:57:06  profilanswer
 

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
n°309894
asphro
Posté le 14-02-2003 à 19:09:58  profilanswer
 

kadreg a écrit :


 
Bah justement non :)


explike !

n°309897
Taz
bisounours-codeur
Posté le 14-02-2003 à 19:13:00  profilanswer
 

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

n°309898
asphro
Posté le 14-02-2003 à 19:13:12  profilanswer
 

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


 
:??:
 

n°309899
asphro
Posté le 14-02-2003 à 19:14:54  profilanswer
 

++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 !!

n°309900
kadreg
profil: Utilisateur
Posté le 14-02-2003 à 19:14:55  profilanswer
 

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 !
n°309901
gloop
Posté le 14-02-2003 à 19:16:35  profilanswer
 

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
n°309902
asphro
Posté le 14-02-2003 à 19:18:06  profilanswer
 

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

n°309903
asphro
Posté le 14-02-2003 à 19:21:10  profilanswer
 

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

n°309904
Taz
bisounours-codeur
Posté le 14-02-2003 à 19:21:34  profilanswer
 

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

n°309906
gloop
Posté le 14-02-2003 à 19:24:26  profilanswer
 

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
n°309908
asphro
Posté le 14-02-2003 à 19:27:22  profilanswer
 

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

n°309909
asphro
Posté le 14-02-2003 à 19:28:55  profilanswer
 

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
n°310159
Musaran
Cerveaulté
Posté le 15-02-2003 à 00:59:38  profilanswer
 

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
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  C fonction malloc et realloc, je comprend pas tout

 

Sujets relatifs
Afficher page en fonction de la liste deroulante (avec une frame) ??Fonction COPY, erreur persistante et très gênante....
Pb avec fonction time()execvp - je ne comprend pas tres bien
evaluer une fonction mathematiquevaleur de fonction de retour
Griser un/des champs en fonction d'une liste de choix.fonction mail() et FAI
pointeur fonction membre[MYSQL] La fonction UNION
Plus de sujets relatifs à : C fonction malloc et realloc, je comprend pas tout


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR