Maison >développement back-end >C++ >Pourquoi « sizeof » donne-t-il différentes tailles de tableau à l'intérieur et à l'extérieur d'une fonction C ?

Pourquoi « sizeof » donne-t-il différentes tailles de tableau à l'intérieur et à l'extérieur d'une fonction C ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-19 10:51:09869parcourir

Why Does `sizeof` Give Different Array Sizes Inside and Outside a C Function?

Pourquoi le calcul de la taille du tableau diffère à l'intérieur d'une fonction en C

Lors du passage d'un tableau à une fonction, C désintègre automatiquement le tableau en un pointeur à son premier élément. Ce pointeur porte l'adresse du premier élément du tableau mais pas sa taille.

Considérons cet exemple :

#include <stdio.h>

void test(int arr[]) {
    int arrSize = (int)(sizeof(arr) / sizeof(arr[0])); // Incorrect
    printf("%d\n", arrSize);
}

int main() {
    int point[3] = {50, 30, 12};

    int arrSize = (int)(sizeof(point) / sizeof(point[0])); // Correct
    printf("%d\n", arrSize); // Prints 3

    test(point);

    return 0;
}

Dans main, sizeof(point) donne correctement la taille de l'ensemble du tableau ( 12 octets). Cependant, dans le test, sizeof(arr) donne 4 octets (la taille d'un pointeur entier), ce qui entraîne un calcul incorrect de la taille du tableau (un élément manquant).

Pour résoudre ce problème, la taille du tableau doit être explicitement passé en tant que paramètre distinct :

void test(int arr[], size_t elems) {
    int arrSize = elems;
    /* ... */
}

int main() {
    int point[3] = {50, 30, 12};
    /* ... */
    test(point, sizeof(point) / sizeof(point[0]));
    /* ... */
}

Notez que sizeof(point)/sizeof(point[0]) fonctionne pour les tableaux alloués par la pile mais pas pour les tableaux alloués dynamiquement puisque il repose sur le mécanisme de désintégration sous-jacent.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn