Bonjour.
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 :
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 ?
Code C : Sélectionner tout - Visualiser dans une fenêtre à part
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; }- Le second problème concerne ce bout de code venant de mes tests :
Si je saisi "Développez.com c'est cool !", voici ce que j'obtiens:
Code C : Sélectionner tout - Visualiser dans une fenêtre à part
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); }
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.
Si quelqu'un pouvait éclairer ma lanterne, ce serait super sympa.
Amicalement,
naute
Partager