Vous êtes sur la page 1sur 4

QCM Bases C

De Ensiwiki
Juste
Faux
Non répondu

1. Pour compiler du C avec gcc en ayant un maximum de warnings du compilateur, il faut utiliser

-Wall
→ Pour afficher tous les warnings de base
-std=c99
→ Non, ça, c'est juste pour passer en mode C99
-Wextra
Oui, l'option -Wall porte mal son nom, elle n'active pas tous les warnings, pour en avoir encore

d'autres, -Wextra peut aider

2. En C, pour lire une valeur entière dans la variable toto, on peut faire

printf("%u", toto);
→ Non, bien sûr, ça, c'est pour afficher sa valeur.
scanf("%u", toto);
→ Non, cette version passe la valeur de toto, scanf ne peut pas écrire dedans
scanf("%u", &toto);
Oui. Ceci dit, dans la vraie vie, scanf n'est pas vraiment recommandé

(http://www.levenez.com/lang/c/faq/fclc008.html#q_8), mais pour nous, c'est suffisant ...

3. Le morceau de code suivant

for (int i = 0; i <= 10; i++);


{
printf("%u", i);
}

fera 10 appels à printf


fera 11 appels à printf
fera un appel à printf
C'est probablement un bug, mais il y a un point virgule en trop sur la ligne du for, qui fait que c'est

une boucle avec un corps vide. Le printf est après la boucle.

4. Une boucle for (A; B; C) { D; } peut se traduire par

A; while (B) { C; D }
→ Non, la partie C sert à passer au tour de boucle suivant, il n'est pas exécuté avant le premier tour,
par exemple.
A; while (B) { D; C }
while (A; B) { C; D }
→ Non, on exécuterait A à chaque tour de boucle.

5. Si on définie une variable comme ceci :

struct paire {
int premier;
int second;
};

struct paire v;

alors on peut accéder au premier élément de v comme ceci :

v->premier
→ On pourrait faire ça si v était un pointeur sur une paire.
v.premier
v[0]
→ Non, une structure et un tableau, ce sont deux choses différentes ...
premier(v)
→ Ça, on le ferait si premier était une fonction.

6. Si t est un tableau, alors on peut accéder à l'élément numéro 3 de t avec

t(3)
→ Non, les parenthèses sont réservées aux appels de fonction.
t[3]
→ C'est la manière standard
*(t + 3)
→ Si on sait que t est un pointeur sur le premier élément du tableau, c'est logique
3[t]
À déconseiller sauf si vous voulez rendre votre code illisible, mais c'est une conséquence de la

question précédente, et de la commutativité de l'addition.

7. Le code suivant

int *f(void) {
int x;
return &x;
}

est correct
→ Non, il renvoit un pointeur sur x qui est une variable locale de f. Cette variable cesse d'exister à
partir du moment où on fait un return.
est incorrect. On pourrait écrire return malloc(sizeof(int)) à la place.
→ Oui. Par contre, c'est la responsabilité de l'appelant d'appeler free plus tard.
est incorrect. On ne peut pas renvoyer de pointeur dans une fonction en C.

8. En C, si on définit int *x, que représente x ?

Un entier non nul


Un pointeur
Une adresse
Un pointeur, ou une adresse, c'est pareil. Un pointeur étant une adresse, plus un type au moment de

la compilation, et simplement une adresse à l'exécution.

9. Le code suivant

struct foo {
int x;
int y;
}

int f(void) {
struct foo *f;
f->x = 42;
printf("%d\n", f->x);
}

peut afficher :

42
24
Segmentation fault
On vient de déréférencer un pointeur non-initialisé, donc il peut se passer absolument n'importe
quoi. Il est probable qu'on obtienne une « Segmentation fault », mais le programme peut aussi
→ marcher « par chance » et afficher 42. Obtenir autre chose qu'un plantage violent ou 42 est peu
probable, mais possible au moins en théorie. Il faudrait initialiser f, typiquement avec f =
malloc(sizeof(struct foo));.

10. Le code suivant

struct foo {
int x;
int y;
}

int f(void) {
struct foo f;
f.x = 42;
printf("%d\n", f.x);
}

peut afficher :
42
La déclaration struct foo f; déclare bien une structure sur la pile. f.x est bien alloué sur la pile,

à l'intérieur de f. Si on l'affecte à 42 et qu'on lit la valeur, la seule possibilité est d'obtenir 42.
24
Segmentation fault
→ La structure étant bien initialisée, on ne peut pas avoir d'erreur à l'exécution.

11. Si x a été alloué avec

int *x = malloc(42 * sizeof(int));

alors, pour libérer la mémoire pointée par x, on peut :

Atteindre la fin de la portée de la variable x, la libération sera automatique.


Non, le pointeur x sera libéré, mais pas la valeur pointée. S'il y a un malloc, alors la mémoire ne

sera libéré qu'au free correspondant.
Exécuter for (int i = 0; i < 42; i++) free(x + i);
Non, même si la zone mémoire correspond à un tableau, un malloc est désalloué avec un seul
→ free. Ça serait différent si x était un tableau de pointeurs (auquel cas on aurait sans doute appelé
malloc une fois par case du tableau).
Exécuter free(x);
Exécuter free(x, 42 * sizeof(int));
Non, free ne prend qu'un argument, il se débrouille sans connaître la taille (que le système a

probablement stocké quelque part, mais ça n'est pas notre affaire).
Rien, la zone pointée par x sera désalloué toute seule quand elle ne sera plus utilisée.
→ Non, on n'est pas en Java, on n'a pas de garbage collector ...

Soumettre Réinitialiser

Votre pointage est 3 / 11

Récupérée de « https://ensiwiki.ensimag.fr/index.php?title=QCM_Bases_C&oldid=28966 »

Catégorie : Logiciel de Base Apprentissage

Dernière modification de cette page le 10 juin 2012 à 14:25.

Vous aimerez peut-être aussi