2010-06-19 3 views
1

Quelqu'un peut-il expliquer ce que je fais mal ici pour ne pas obtenir 11 comme ma sortie?Pourquoi l'entier n'est pas incrémenté dans ce code?

void foo { 
    int *n = malloc(sizeof(int)); 
    *n = 10; 
    n++; 
    printf("%d", *n) 
} 
+8

vous êtes également fuit le pointeur. – Stephen

+0

@Stephen, non seulement fuit le pointeur mais le fait d'une manière intéressante. :) – BobbyShaftoe

+1

Eh bien, 'n ++' * est * défini car il est juste après la fin d'un objet alloué, donc vous pouvez faire 'n -' et récupérer le pointeur. – Artelius

Répondre

25

n++ incrémente le pointeur n, non l'entier pointé par n. Pour augmenter le nombre entier, vous devez déréférencer le pointeur, puis incrémenter le résultat de cette:

(*n)++; 
+0

Suggestion de modifier légèrement le libellé: "Pour déréférencer l'entier" -> "Pour incrémenter l'entier" –

+2

@Matt: Oui; Je viens de voir ça. Il devait y avoir une erreur de bus entre mon cerveau et mes doigts. :-) Merci. –

9

Si nous appelons la variable x malloc, votre programme ne ceci:

         n  x 
int *n = malloc(sizeof(int));  &x  ? 
*n = 10;        &x 10 
n++;        &x+1 10 

Vous voulez faire:

         n  x 
int *n = malloc(sizeof(int));  &x  ? 
*n = 10;        &x 10 
(*n)++;        &x 11 
+1

'' '' '' 'a' '' '' '' '' a '' '' '' '' '' a plus de priorite que l 'unaire '*', donc les parentheses sont necessaires afin d' effectuer le dereference avant l 'increment. –

+1

@James: K & R dit la même précédence, mais l'associativité de droite à gauche, donc les parenthèses sont toujours nécessaires. – dmckee

+0

Bien sûr que oui. Edit reflète cela. – Artelius

2

Vous définissez n [0] à 10, puis vous imprimez n [1]. malloc() n'initialise pas la mémoire qu'il vous donne, donc ce qui est imprimé est imprévisible - c'est la poubelle qui se trouve dans n [1].

+0

Excepté, bien sûr, qu'il n'y a pas de n [1] ', donc vous lisez depuis au-delà de la fin de la mémoire allouée, dont le comportement est indéfini. –

+0

Tout à fait raison! Je n'avais pas remarqué qu'il utilisait malloc pour allouer un seul int. – rettops

2

Vous pouvez obtenir 11 comme sortie avec ce code:

void foo { 
    int *n = malloc(sizeof(int)); 
    *n = 10; 
    (*n)++; 
    printf("%d", *n) 
} 
1

n ++ déplace le pointeur sizeof (int) octets avant.

+0

oui ... j'ai réalisé et édité :) – Jason

Questions connexes