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)
}
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)
}
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)++;
Suggestion de modifier légèrement le libellé: "Pour déréférencer l'entier" -> "Pour incrémenter l'entier" –
@Matt: Oui; Je viens de voir ça. Il devait y avoir une erreur de bus entre mon cerveau et mes doigts. :-) Merci. –
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
'' '' '' 'a' '' '' '' '' a '' '' '' '' '' a plus de priorite que l 'unaire '*', donc les parentheses sont necessaires afin d' effectuer le dereference avant l 'increment. –
@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
Bien sûr que oui. Edit reflète cela. – Artelius
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].
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. –
Tout à fait raison! Je n'avais pas remarqué qu'il utilisait malloc pour allouer un seul int. – rettops
Vous pouvez obtenir 11 comme sortie avec ce code:
void foo {
int *n = malloc(sizeof(int));
*n = 10;
(*n)++;
printf("%d", *n)
}
vous êtes également fuit le pointeur. – Stephen
@Stephen, non seulement fuit le pointeur mais le fait d'une manière intéressante. :) – BobbyShaftoe
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