C fonction malloc et realloc, je comprend pas tout - C++ - Programmation
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.
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é. |
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 ?
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
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! |
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 !
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]
Marsh Posté le 14-02-2003 à 14:32:15
++Taz a écrit : et alors? |
la n'etait pas le probleme de toute facon
Marsh Posté le 14-02-2003 à 17:29:27
kadreg 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
Marsh Posté le 14-02-2003 à 17:49:23
AsPHrO a écrit : kadreg pour le nom de ce prog qui m a permis de mieux comprendre et cette petite explication ! |
Marsh Posté le 14-02-2003 à 18:51:13
AsPHrO a écrit : kadreg pour le nom de ce prog qui m a permis de mieux comprendre et cette petite explication ! |
attention ++taz et taz++ c'est pas pareil
Marsh Posté le 14-02-2003 à 18:53:35
gloop a écrit : |
skoi la diff entre ++taz et taz++ ?
ca rend le même nombre pourtant !
Marsh Posté le 14-02-2003 à 18:55:55
AsPHrO a écrit : |
Bah justement non
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
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])
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 == |
entre une affection et un operateur booléen je crois qu il ya une diff non ?
sinon kad :
Code :
|
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 |
oui j ai rien dis
ct une explication, je croyais ct un exemple !!
Marsh Posté le 14-02-2003 à 19:14:55
AsPHrO a écrit : |
Code :
|
Marsh Posté le 14-02-2003 à 19:16:35
AsPHrO a écrit :
|
maintenant fait ca:
Code :
|
tu devrais comprendre la difference
edit: oups, le temps de téléphoner et grillé
Marsh Posté le 14-02-2003 à 19:18:06
kadreg a écrit :
|
hu !
man google difference ++i i++
Marsh Posté le 14-02-2003 à 19:21:10
bon google rend pas service !
vous voulez continuer a jouer ! ou on m'explique !
Marsh Posté le 14-02-2003 à 19:21:34
AsPHrO 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++
Marsh Posté le 14-02-2003 à 19:24:26
AsPHrO a écrit : bon google rend pas service ! |
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 ?
Marsh Posté le 14-02-2003 à 19:27:22
++Taz a écrit : |
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
Marsh Posté le 14-02-2003 à 19:28:55
gloop a écrit : |
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 !
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'.
Marsh Posté le 14-02-2003 à 11:52:21
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
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
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