[C] pourquoi ça ne plante pas ?

pourquoi ça ne plante pas ? [C] - C - Programmation

Marsh Posté le 21-12-2003 à 16:08:42    

Code :
  1. result = (char *)malloc(1*sizeof(char));
  2. result[0] = 's';
  3. result[1] = 'e';
  4. result[2] = 't';
  5. result[3] = 0;


 
bon je débute encore avec les pointeurs et je pige pas un truc.
ce code marche parfaitement (sous mandrake). ça devrait pas plutôt faire un segfault (car j'ai pas fait un malloc(4*sizeof.. ) ?
si c'est bien le cas, y'a un moyen de faire en sorte que ça plante vraiment ? (sinon c'est dûr après pour moi de tester)

Reply

Marsh Posté le 21-12-2003 à 16:08:42   

Reply

Marsh Posté le 21-12-2003 à 16:12:48    

1) cast inutle
2) sizeo(char) == 1 par définition
3) par ce que la zone mémoire contigue t'appartient sans doute. cela dit ça peut tout et n'importe quoi ... des fois on tape sur un truc dans la pile qui sert au retour de la fonction et boom
4) utilise Electric Fence, pour plus de sécurités

Reply

Marsh Posté le 21-12-2003 à 16:32:51    

mais imagine j'ai un tableau de 2 caractères.

Code :
  1. result = (char *)malloc(2*sizeof(char));
  2. result[0] = 's';
  3. result[1] = 0;

 
jusque là pas de problème.
 
par contre si ensuite je veux augementer la taille de mon tableau, c'est là que je ne suis pas sûr de la syntaxe et c'est pour ça que l'absence d'erreur dans le code précédent me gène.
est-ce que ceci est ok ?

Code :
  1. result = (char *)malloc(2*sizeof(char));
  2. result[0] = 's';
  3. result[1] = 0;
  4. result = (char *)realloc(result, 4*sizeof(char));
  5. result[1] = 'g';
  6. result[2] = 'z';
  7. result[3] = 0;

Reply

Marsh Posté le 21-12-2003 à 16:43:09    

Taz a écrit :

1) cast inutle
2) sizeof(char) == 1 par définition
3) par ce que la zone mémoire contigue t'appartient sans doute. cela dit ça peut tout et n'importe quoi ... des fois on tape sur un truc dans la pile qui sert au retour de la fonction et boom
4) utilise Electric Fence, pour plus de sécurités

[:quoted]

Reply

Marsh Posté le 21-12-2003 à 16:46:29    

je vois pas la réponse à ma question dans ton post... :-/

Reply

Marsh Posté le 21-12-2003 à 16:48:00    

la réponse est « c'est normal »  
commence par prendre en compte mes 4 remarques

Reply

Marsh Posté le 21-12-2003 à 17:15:52    

si ça plante pas (segfault, ou page fault), ça peut être dû à la granularité/alignement de l'allocation (allocation par paquets de x octets, de toutes façon les os allouent de la mémoire aux process par pages de 4ko ou 4mo dans le cas de cpus x86).


Message édité par bjone le 21-12-2003 à 17:16:06
Reply

Marsh Posté le 21-12-2003 à 17:32:15    

j'sais pas si j'ai du mal ou pas mais je ne pige tjrs pas.
est-ce que le code suivant est bien correct ou non ???

Code :
  1. result = (char *)malloc(2*sizeof(char)); 
  2.   result[0] = 's'; 
  3.   result[1] = 0; 
  4.   result = (char *)realloc(result, 4*sizeof(char));
  5.   result[1] = 'g'; 
  6.   result[2] = 'z'; 
  7.   result[3] = 0;

Reply

Marsh Posté le 21-12-2003 à 17:32:53    

BJOne a écrit :

si ça plante pas (segfault, ou page fault), ça peut être dû à la granularité/alignement de l'allocation (allocation par paquets de x octets, de toutes façon les os allouent de la mémoire aux process par pages de 4ko ou 4mo dans le cas de cpus x86).

non, ça n'est pas la raison. ça ne plante pas parce que tu te balades dans une zone qui t'appartient également, même si éthiquement tu n'en as pas le droit

Reply

Marsh Posté le 21-12-2003 à 17:33:23    

Taz a écrit :

1) cast inutle
2) sizeof(char) == 1 par définition
3) par ce que la zone mémoire contigue t'appartient sans doute. cela dit ça peut tout et n'importe quoi ... des fois on tape sur un truc dans la pile qui sert au retour de la fonction et boom
4) utilise Electric Fence, pour plus de sécurités

[:quoted]
sinon oui il est correct

Reply

Marsh Posté le 21-12-2003 à 17:33:23   

Reply

Marsh Posté le 21-12-2003 à 17:35:20    

ok thx

Reply

Marsh Posté le 22-12-2003 à 20:21:28    

comme l'a dit Taz, la lib efence est ton amie ;)

Reply

Marsh Posté le 23-12-2003 à 00:52:58    

yep mais apparement efence a pas été installé avec ma mandrake. faut que je vois où dw ça..

Reply

Marsh Posté le 23-12-2003 à 11:02:06    

urpmi electricfence

Reply

Sujets relatifs:

Leave a Replay

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