Que font ces lignes de code ?

#include <stdio.h>

int main() {
    int x = 5;
    &x = 18;
    *x = 10;

    int *y = 0;
    &y = 18;
    *y = 10;

    return 0;
}
  • A. Le code contient des erreurs de compilation dues à l'assignation incorrecte d'adresses et à la déréférence de variables non pointeurs.
  • B. Le code provoquera une erreur de segmentation à l'exécution en raison de la déréférence d'un pointeur NULL.
  • C. Le code ne compile pas car il tente d'assigner des valeurs entières à des adresses mémoire.
  • D. Le code ne fait rien car les erreurs de compilation empêchent son exécution.

Fait une schéma mémoire.
Expliqué les différentes lignes. 

Que font ces lignes de code ?

int a = 0xffffffff;
void *ptr = (void*)&a;
*(char*)ptr = 8;
  • A) Elles changent la valeur de a (int) à 8 (donc 4 octets modifiés)
  • B) Elles changent le premier octet de a : 0x08ffffff
  • C) Elles changent le dernier octet de a : 0xffffff08
  • D) Elles provoquent une erreur de compilation
  • E) Autre chose ? 

Quelle sera la sortie du programme suivant ?

#include <stdio.h>

int main() {
    int x = 5;
    int *ptr = &x;
    *ptr = 10;
    printf("%d\n", x);
    return 0;
}
  • A) 5
  • B) 10
  • C) Erreur de segmentation
  • D) Ça ne compile pas

Que fait le code suivant ?

#include <stdio.h>

void A(int val) {
    val = 42;
}

int B(int val) {
    return val+12;
}

void C(int *ptr) {
    *ptr = 20;
}

int main() {
    int a = 15;
    A(a);
    printf("%d\n", a);
    B(&a);
    printf("%d\n", a);
    C(a);
    printf("%d\n", a);
    return 0;
}
  • A) Il affiche 42, 54, 20
  • B) Il affiche 15, 27, 20
  • C) Il affiche 15, 27, 27
  • D) Il provoque une erreur de compilation
  • E) Autre ?

Quelle sera la sortie du programme suivant ?

#include <stdio.h>

int main() {
    int arr[5] = {1, 2, 3, 4, 5};
    int *ptr = arr + 2;
    printf("%d\n", *ptr);
    return 0;
}
  • A) 1
  • B) 2
  • C) 3
  • D) 4

Que fait le code suivant ?

#include <stdio.h>

int main() {
    char str[] = "Hello";
    char *ptr = str;
    while (*ptr != '\0') {
        *ptr = *ptr + 1;
        ptr++;
    }
    printf("%s\n", str);
    return 0;
}
  • A) Il affiche "Hello"
  • B) Il affiche "Ifmmp"
  • C) Il provoque une erreur de segmentation
  • D) Il ne compile pas