Bases de la programmation en C

void f(int a[10]) {
    printf("%zu\n", sizeof a);
}
int main(void) {
    int b[10] = {0};
    printf("%zu ", sizeof b);
    f(b);
    return 0;
}

int fait 4 octets et un pointeur 8 octets. Quelle est la sortie obtenue en exécutant le programme ci-dessus ?

  1. A10 10
  2. B40 8
  3. C40 40
Afficher la réponse et l'explication

Réponse : B. 40 8

Dans main, b est un tableau de 10 int : sizeof b vaut 10 × 4 = 40 octets. Même si le paramètre de la fonction est écrit int a[10], il n'est pas traité comme un tableau mais comme un pointeur sur int (int *a), et f(b) ne transmet que l'adresse du premier élément. sizeof a dans f vaut donc 8, la taille d'un pointeur. L'option -Wall de gcc donne un avertissement pour ce sizeof. Lorsqu'une fonction a besoin du nombre d'éléments d'un tableau, on le lui passe comme argument séparé.

S'entraîner sur ce thème Retour au thème

Autres questions sur Bases de la programmation en C

  1. int fait 4 octets. Quelle est la sortie obtenue en exécutant le code ci-dessus ?
  2. Quelle est la sortie obtenue en exécutant le code ci-dessus, qui porte sur un tableau de char contenant une chaîne ?
  3. Après les déclarations ci-dessus, on écrit l'une des instructions A « p = t; », B « *p = 'x'; », C « q = t; » ou D « *q = 'x'; ». Quelle combinaison indique celles qui provoquent une erreur de compilation ?
  4. Quelle est la sortie obtenue en exécutant le programme ci-dessus, qui utilise un tableau de pointeurs de fonction ?
  5. fill et use sont des fonctions définies ailleurs. Quel est le problème de la fonction ci-dessus ?