en passant char tampon de fonctions et d'obtenir la taille de la mémoire tampon
J'ai mis le tampon de taille 100.
Je l'affichage de la mémoire tampon dans la fonction principale lorsque la mémoire tampon est déclaré.
Cependant, lorsque je passe de la mémoire tampon à la fonction et obtenir le sizeof '4',
Je pensais qu'il devrait être de 100, comme c'est la taille de la mémoire tampon que j'
créé en main.
sortie:
taille de la mémoire tampon: 100
sizeof(buffer): 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));
}
Dans main() explicitement déclaré un tableau, tandis que dans load_buffer() vous avez déclaré un pointeur. La différence est dans main (), le compilateur sait que le tampon est un tableau, mais dans load_buffer (), le compilateur ne sait pas si le tampon est à partir d'un tableau, ou un alloués à la paix de la mémoire dans le tas, ou une structure ou quoi que ce soit. Le compilateur ne connaît que l'adresse de mémoire (donc un pointeur), donc sizeof() retourne la taille de l'adresse de la mémoire, qui est de 4 octets de long (parce que c'est une machine 32 bits, si c'était une machine 64 bits, il serait long de 8 octets). Espérons que cela aide à comprendre un peu plus.
Au lieu de sizeof() de la fonction, utiliser strlen(), puis il retourne la taille de la valeur du pointeur.
Au lieu de sizeof() de la fonction, utiliser strlen(), puis il retourne la taille de la valeur du pointeur.
OriginalL'auteur ant2009 | 2009-03-04
Vous devez vous connecter pour publier un commentaire.
Vous êtes à l'aide la taille de le pointeur vers le tampon (4 octets), plutôt que la taille de la mémoire tampon.
En C, vous devez passer la taille de la mémoire tampon séparément, ce qui fait partie de la raison de dépassements de mémoire tampon se passer si facilement et fréquemment.
OriginalL'auteur Mitch Wheat
Les réponses par Mitch le Blé et hhafez sont complètement à droite et au point. Je vais vous montrer quelques informations supplémentaires qui peuvent s'avérer utiles parfois.
Noter que la même chose se produit si vous dire au compilateur que vous avez un tableau de la bonne taille
D'un tableau comme paramètre est juste de déclarer un pointeur. Le compilateur automatiquement les changements de
char *name
même si il a été déclaré commechar name[N]
.Si vous voulez forcer les appelants pour passer un tableau de taille 100 seulement, vous pouvez accepter l'adresse de la table (et le type de l') au lieu de:
C'est un pointeur vers le tableau que vous avez en main, vous avez donc besoin de déréférencer dans la fonction permettant d'obtenir le tableau. L'indexation est alors fait par
Personne que je connaisse est de faire cela et je ne suis ni le faire moi-même, car il plutôt complique le passage de l'argument. Mais il est bon de savoir à ce sujet. Vous pouvez appeler la fonction comme ceci puis
Si vous souhaitez accepter les autres tailles trop, j'irais avec le passage de l'option-N les deux autres réponses recommander.
OriginalL'auteur Johannes Schaub - litb
De l'OP
Même si vous pouvez imaginer que
load_buffer()
est passé lebuffer
par refrence, ce qui se passe réellement est que vous êtes en passant un pointeur verschar
par valeur. Le tableau réel n'est pas passé donc il n'y a aucun moyen pour leload_buffer()
fonction pour connaître la taille de la mémoire tampon de la matrice deDonc, qu'est-ce que
sizeof(buffer)
faire? C'est tout simplement le retour de la taille d'un pointeur vers char. Siload_buffer()
besoin de la taille de labuffer
il doit être passé speratly.Ou vous pouvez créer une nouvelle structure qui contient à la fois un char tableau et la taille de la matrice, et de passer un pointeur vers cette structure au lieu de cela, de cette façon, le tampon et sa taille sont toujours ensemble 😉
OriginalL'auteur hhafez
Ce qui se passe, c'est quand on passe un tableau à une fonction, vous n'passer l'adresse du tableau dans la mémoire, pas la taille du tableau. Ce sizeof(buffer) est sortie en load_buffer() est la taille du pointeur, qui est de quatre octets.
La meilleure façon de garder la taille de la mémoire tampon dans la fonction est de modifier la fonction d':
et de l'appel à:
et ensuite utiliser la longueur à chaque fois que vous voulez que la taille de la mémoire tampon.
OriginalL'auteur DeadHead