2 votes

C - arithmétique des pointeurs, résultats inattendus

Voici un exemple de code:

int* arr = (int*)malloc(2 * sizeof(int));

arr = arr + 1;
*arr = 11;
arr[-1] = 22;

int x = arr[0]; // x = 11
int y = arr[1]; // y = 194759710

Après une allocation mémoire, le pointeur arr est incrémenté. Je m'attendais à obtenir les résultats suivants:

x == 22
y == 11

Pouvez-vous expliquer comment cela fonctionne ?

5voto

Lundin Points 21616

L'attribution y est incorrecte. Vous avez seulement 2 éléments alloués donc vous ne pouvez pas d'abord incrémenter le pointeur de un, puis déréférencer ce pointeur avec [1], car cela donne un 3ème élément qui n'existe pas.

5voto

purplepsycho Points 4062

Lorsque vous définissez x et y, vous avez oublié que arr ne pointe plus sur une mémoire allouée.

Ce code fait ce que vous voulez:

#include 
#include 

int main(void) {

    int* arr = (int*)malloc(2 * sizeof(int));
    int *original = arr;

    arr = arr + 1;

    *arr = 11;
    arr[-1] = 22;

    int x = original [0]; // x = arr[-1]
    int y = original [1]; // y = arr[0]

    printf("%d, %d\n", x, y);
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X