[C] Pb de taille de chaine de caractère

Pb de taille de chaine de caractère [C] - Programmation

Marsh Posté le 22-01-2002 à 10:30:55    

Voila mon problème :
 
J'ai un char nom[25] et mon boss m'a dit que si je saississait un nombre supérieur à 25 le nom serait alors tronqué. Donc j'ai réfléchit et je voulais vous demander si y avait pas moyen de mettre à jour la taille du tableau.  
 
Enfin c'est mon boss qui me demande ça, moi au début j'avais mis cha nom[1000000] et comme ça on était tranquille
 
Merci de vos réponses

Reply

Marsh Posté le 22-01-2002 à 10:30:55   

Reply

Marsh Posté le 22-01-2002 à 11:17:31    

je pense que tu devrais faire une allocation dynamique en utilisant malloc et free...

Reply

Marsh Posté le 22-01-2002 à 13:11:20    

char nom[25] réserve 25 "cases" en mémoire, donc permet de stocker un nom de 24 caractères (plus le \0 terminal de fin de chaîne).
 
char nom[1000000], ça gâche la mémoire.
 
Si on connait la taille de ce qu'on veut y mettre, on peut faire
char *nom; // pointeur
nom = (char *)malloc(Volume + 1); // alloue de la mémoire en quantité suffisante, le +1 est pour le '\0' terminal.
si nom != NULL, on peut l'utiliser
nom[0] = '\0'; si on veut l'initialiser
 
 
quand fini d'exister, on fait un free(nom);  
Le pointeur existe toujours, mais il n'y a plus de mémoire associée.
 
En C++ (je débute), on peut faire
nom = new char[Volume + 1];  
 
 
puis  
delete nom; // pr libérer la mémoire

Reply

Marsh Posté le 22-01-2002 à 14:29:14    

Juste pour preciser : attribuer plus de 25 caracteres (enfin 24 + null terminator) a un tableau de char de [25], c'est plus dangereux en C ou C++ qu'une simple chaine tronquee. En fait, ton char nom[25] te ramene un pointeur ( nom ) vers un tableau de 25 char. Si tu mets ds cette variable par exemple 30 char, tu vas avoir un depassement. Et le C ou le C++ ne controlent pas ca et pas consequent tu ecris par dessus des infos deja allouees (autres variables, etc).
 
Une des fautes les plsu frequentes et les plus dures a debugger parce que vas-t-en trouver qu'une variable ne contient pas les donnees qu'elle devrait avoir a cause du depassement d'un tableau :cry:  
 
Donc prudence !

Reply

Marsh Posté le 22-01-2002 à 14:45:15    

J'avais oublié de préciser ce côté des choses, désolé.
 
On écrase les variables tranquillement installées en mémoire quand on écrit "hors de chez soi". C'est aussi pourquoi il est indispensable de prévoir le 0 terminal, car écrire 25 caractères dans une chaîne de 25 cases écrase la variable voisine avec le 26 ème caractère, le '\0'...
 
Les variables étant rangées en mémoire les unes à la suite des autres, et occupant l'espace correspondant à leur taille (int, pointeur, ..), on peut "facilement" faire des dégats si on est étourdi. :)

Reply

Sujets relatifs:

Leave a Replay

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