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
Libérer: 2024-12-19 10:51:09
original
850 Les gens l'ont consulté

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;
}
Copier après la connexion

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]));
    /* ... */
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal