1 pièce(s) jointe(s)
Demande d'éclaircissements dans l'utilisation de malloc() et de realloc().
Bonjour :D .
J'ai besoin d'utiliser les techniques d'allocation dynamique de mémoire pour travailler sur des chaînes de caractères dans des programmes C. Mes connaissances en C étant très limitées, je fais des tests et je consulte les tutoriels traitant de ce sujet.
Je butte actuellement sur deux problèmes :
- Le premier problème vient d'un fragment de code issu du tutoriel Description des mécanismes d'allocation dynamique de mémoire en langage C :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
int * temp;
temp = realloc (tabentier, 4 * sizeof(int) );
if ( temp == NULL )
{
fprintf(stderr,"Reallocation impossible");
free(tabentier);
exit(EXIT_FAILURE);
}
else
{
tabentier = temp;
} |
Si on libère le pointeur "tabentier" en cas de réallocation impossible, les données sur lesquelles il pointait deviennent inaccessibles. Le fait de passer par un pointeur temporaire pour protéger "tabentier" ne sert donc plus à rien. D'autre part, si l'allocation réussit, une fois que "tabentier" a pris la valeur "temp", que devient son ancienne adresse mémoire ? - Le second problème concerne ce bout de code venant de mes tests :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
|
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
unsigned char *reception = NULL; // Caractères ASCII de 0 à 255
int taille = 50;
int nbCar;
reception = malloc(taille); // Allocation de la mémoire
if (reception == NULL)
{
exit(0);
}
for (int i = 0; i < taille; i++)
{
reception[i] = NULL;
}
reception[taille -1] = '\0';
printf("L'adresse mémoire est %d\n", reception);
printf("sizeof(*reception) = %i\n", sizeof(*reception));
printf("sizeof(reception) = %i\n", sizeof(reception));
printf("Le contenu de \"réception\" est \"%d\"\n", *reception);
printf("Saisissez une chaîne : ");
scanf("%s", reception);
nbCar = strlen(reception);
reception[nbCar] = '\0'; // Ajout du caractère de fin de chaîne
printf("Vous avez saisi \"%s\"\n", reception);
printf("La chaîne fait %d caractères\n", nbCar);
for (int i = 0; i < nbCar; i++)
{
printf("Le caractère n° %d est : %c (ASCII %d)\n", i, reception[i], reception[i]);
}
free(reception);
reception = NULL;
return(0);
} |
Si je saisi "Développez.com c'est cool !", voici ce que j'obtiens:
Pièce jointe 544350
Les deux points qui m'embêtent le plus sont :
- pourquoi la chaîne est-elle coupée au niveau de l'espace ?
- pourquoi le caractère accentué n'est-il pas reconnu quand j'affiche les caractères un par un alors qu'il l'est quand j'affiche la chaîne ?
Pour info, le "é" de code ASCII 130 est toujours remplacé par les caractères de code ASCII 195 et 169, le "à" (133) sera remplacé par 195 et 160, le "ù" (151) par 195 et 185 etc.
Les explications sont peut-être très simples mais moi je me gratte la tête :aie: .
Si quelqu'un pouvait éclairer ma lanterne, ce serait super sympa.
Amicalement,
naute