GNT sans publicité, site mobile, fonctionnalitées exclusives...

comprendre malloc et realloc

Le
heron
Bonjour

Je débute avec le C depuis quelques mois à mon rhytme. J'arrive au
chapitre de l'allocation dynamique. J'ai abordé les tableaux uni et
multidimensionnels, les pointeurs, les fonctions.

En fait, je comprends l'utilité de malloc dans le sens ou la
réservation de la mémoire pour un tableau peut se faire en cours
d'exécution

Pour la saisie de texte, je voudrais savoir s'il serait possible de
saisir une chaîne de caractère variable avec fgets ? Je pense beaucoup
à utiliser realloc.

Par exemple : je réserve de la mémoire pour un pointeur vers une
adresse de type caractère, pour 1 ou 2 caractères et à je demande à
l'utilisateur de saisir du texte. A chaque saisie, je réserve la place
pour un caractère supplémentaire en mémoire avec realloc, c'est
faisable? Bizarement, je ne trouve aucun code qui correspond à ce que
je recherche sur le net.

Ca ressemble à peu près, mais ça ne marche pas :
http://www.cppfrance.com/forum/suje...TAILLE-VA=
RIABLE-STDIN_1405662.aspx

Autre question sans lien avec la première :
est-ce que écrire char* chaine = 0 et char *chaine = 0 revient à la
même chose?

Merci,
Lire les 47 réponses

Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 10
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
espie
Le #22119081
In article heron
Par exemple : je réserve de la mémoire pour un pointeur vers une
adresse de type caractère, pour 1 ou 2 caractères et à je demande à
l'utilisateur de saisir du texte. A chaque saisie, je réserve la place
pour un caractère supplémentaire en mémoire avec realloc, c'est
faisable? Bizarement, je ne trouve aucun code qui correspond à ce que
je recherche sur le net.



C'est faisable, mais personne ne le fait parce que ca n'est pas efficace.
realloc a un cout non nul, du coup, on en fait moins.

Le classique, c'est de doubler la taille du tampon a chaque fois.
heron
Le #22119231
Pourquoi ce code ne renvoie pas le texte saisie?

#include #include
int main(void)
{
char* chaine = 0 ;
char c ;
int i = 0 ;

printf("Tapez une phrase :") ;

while ( (c = getchar() ) && c != EOF )
{
++i ;
chaine = realloc(chaine, (i+1) * sizeof(char) ) ;
chaine[i-1] = c ;
chaine[i] = 0 ;
}

printf("nVous avez entre : '%s'n", chaine) ;
free(chaine) ;

return 0 ;
}

simple question : char* chaine et char *chaine c'est différent?
heron
Le #22119261
Ce que je souhaiterais avec des caractères :

#include #include
int main(void)
{
int input, n ;
int cnt = 0 ;
int *numbers = NULL ;

do
{
printf("nEnter an integer value (enter 0 to stop) : ") ;
scanf("%d", &input) ;
cnt++ ;
numbers = (int *) realloc (numbers, cnt * sizeof(int) ) ;

if ( numbers == NULL )
{
puts("Error (re)allocating memory") ;
exit(1) ;
}

numbers[cnt-1] = input ;

} while ( input != 0 ) ;

printf("nNumbers entered : ") ;

for ( n = 0 ; n < cnt-1 ; n++ )
printf("n%d ", numbers[n]) ;

printf("nn") ;
return 0 ;
}
Eric Dorino
Le #22119251
On Fri, 14 May 2010 17:08:03 -0700, heron wrote:

Bonjour

Pourquoi ce code ne renvoie pas le texte saisie?



Il le renvoie lorsque une fin de fichier est lue.


#include #include
int main(void)
{
char* chaine = 0 ;
char c ;
int i = 0 ;

printf("Tapez une phrase :") ;

while ( (c = getchar() ) && c != EOF ) {



while ( (c = getchar() ) && c != EOF && c != 'n' ) {
termine la boucle en fin de ligne et affiche le texte.

++i ;
chaine = realloc(chaine, (i+1) * sizeof(char) ) ; chaine


[i-1] = c ;
chaine[i] = 0 ;
}

printf("nVous avez entre : '%s'n", chaine) ; free(chaine) ;

return 0 ;
}

simple question : char* chaine et char *chaine c'est différent?



De le même manière que "bonnet blanc" et "blanc bonnet" sont
différents :-)
Pour le compilateur: non.

--
Eric
heron
Le #22119271
>    char c ;

>    while ( (c = getchar() ) &&  c != EOF ) {

        while ( (c = getchar() ) &&  c != EOF  && c != 'n' ) {
termine la boucle en fin de ligne et affiche le texte.

> simple question : char* chaine et char *chaine c'est différent?

De le même manière que "bonnet blanc" et "blanc bonnet" sont
différents :-)
Pour le compilateur: non.

--
Eric



Il me semblait que c devait être déclaré comme int pour agir dans le
buffer avec
while ( c = getchar() != 'n' && c != EOF )
;
je pense que c'est parce que EOF renvoie -1 ...

Merci de l'info pour char* et char *
Publicité
Suivre les réponses
Poster une réponse
Anonyme