Question

J'ai défini le tampon à la taille 100. J'affiche le tampon dans la fonction principale où le tampon est déclaré. Cependant, lorsque je passe le tampon à la fonction et que j'obtiens le sizeof '4', Je pensais qu'il devrait être 100, car c'est la taille de la mémoire tampon que je créé en main.     sortie:     taille de la mémoire tampon: 100     sizeof (tampon): 4

#include <string.h>
#include <stdio.h>

void load_buffer(char *buffer);

int main()
{
    char buffer[100];
    printf("buffer size: %d\n", sizeof(buffer));
    load_buffer(buffer);

    return 0;
}

void load_buffer(char *buffer)
{
    printf("sizeof(buffer): %d\n", sizeof(buffer));
}
Était-ce utile?

La solution

Vous utilisez la taille du pointeur sur le tampon (4 octets), plutôt que la taille du tampon.

En C, vous devez indiquer séparément la taille de la mémoire tampon, ce qui fait partie de la raison pour laquelle les dépassements de mémoire tampon se produisent si facilement et fréquemment.

void load_buffer(char * buffer, size_t bufSize)
{    
    ...
}

Autres conseils

Les réponses de Mitch Wheat et Hhafez sont tout à fait exactes et pertinentes. Je vais montrer quelques informations supplémentaires qui peuvent s'avérer utiles parfois.

Notez que la même chose se produit si vous dites au compilateur que vous avez un tableau de la bonne taille

void load_buffer(char buffer[100]) {
    /* prints 4 too! */
    printf("sizeof(buffer): %d\n", sizeof(buffer));
}

Un tableau en tant que paramètre ne fait que déclarer un pointeur. Le compilateur le remplace automatiquement par char * name même s'il a été déclaré comme nom du caractère [N] .

Si vous souhaitez forcer les appelants à transmettre un tableau de taille 100 uniquement, vous pouvez accepter l'adresse du tableau (et son type) à la place:

void load_buffer(char (*buffer)[100]) {
    /* prints 100 */
    printf("sizeof(buffer): %d\n", sizeof(*buffer));
}

C'est un pointeur sur le tableau que vous avez dans main, vous devez donc déréférencer la fonction pour obtenir le tableau. L'indexation se fait ensuite par

buffer[0][N] or (*buffer)[N]

Personne que je connais ne le fait et je ne le fais pas moi-même, car cela complique plutôt le passage de l'argument. Mais il est bon de savoir à ce sujet. Vous pouvez appeler la fonction comme ceci alors

load_buffer(&buffer)

Si vous souhaitez également accepter d'autres tailles, j'opterais pour l'option de passage-N, recommandée par les deux autres réponses.

À partir de l'OP

void load_buffer(char *buffer)
{
    printf("sizeof(buffer): %d\n", sizeof(buffer));
}

Même si vous pouvez imaginer que load_buffer () se voit attribuer le tampon par référence, ce qui se passe réellement est que vous passez un pointeur sur char par valeur. Le tableau réel n'est pas transmis. Par conséquent, la fonction load_buffer () ne peut pas connaître la taille du tableau de mémoire tampon

.

Alors que fait sizeof (tampon) ? Il renvoie simplement la taille d'un pointeur à char. Si load_buffer () a besoin de la taille du tampon , il doit être passé séparément.

Vous pouvez également créer une nouvelle structure contenant à la fois un tableau de caractères et la taille de celui-ci, puis passer un pointeur sur cette structure. Ainsi, le tampon et sa taille sont toujours ensemble;)

Ce qui se passe, c’est que lorsque vous passez un tableau à une fonction, vous ne communiquez que l’adresse du tableau dans la mémoire, pas la taille du tableau. Ce que sizeof (tampon) produit dans load_buffer () correspond à la taille du pointeur, qui est de quatre octets.

Le meilleur moyen de conserver la taille de la mémoire tampon dans la fonction est de changer la fonction en:

void load_buffer(char *buffer, int length);

et l'appel à:

load_buffer(buffer, sizeof(buffer));

puis utilisez la longueur à chaque fois que vous voulez la taille du tampon.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top