C le style des tableaux de char - Combien d'octets conservons-nous?
char firstName[32];
Je comprends que chaque char occupe 1 octet en mémoire. Le fait de la ci-dessus occupent 32 octets de mémoire?
Ai-je raté un pointeur qui prend de la mémoire trop ou est-ce juste de 32 octets?
La taille d'un tableau est le nombre d'éléments de fois la taille de chaque élément, par la norme. Donc, oui, puisque vous avez à 32 éléments et chacun a une taille d'un (
sizeof(char)
est toujours un), la taille totale est de 32.OriginalL'auteur Carlo del Mundo | 2010-08-09
Vous devez vous connecter pour publier un commentaire.
Non, qui reprend exactement 32 octets de mémoire.
Il n'y a pas de pointeur.
Ce qui est souvent une source de confusion, car un nom de tableau en silence "désintègre" à un "char*"
Donc,
firstName
peut être de typeconst char*
, mais il n'est pas lui-même une variable char*. C'est exactement comme:x
est de type int variable et prend de la place.5
d'autre part, est juste une valeur constante de type int. Il prend de l'espace; c'est juste une valeur.OriginalL'auteur James Curran
Il occupe exactement 32 octets de mémoire.En interne tout d'une adresse.Les Variables sont seulement pour notre compréhension.
OriginalL'auteur chaitanyavarma
C'est juste de 32 octets. Le nom de la matrice parfois agit comme un pointeur vers le premier élément, mais il n'est pas un pointeur.
OriginalL'auteur Thomas
Qui prend en hausse de 32 octets. Il tiendra un 31-chaîne de caractères (l'autre octet est pour le nul de fin de chaîne).
OriginalL'auteur David Thornley
La déclaration
char firstName[32]
crée un tableau de 32 caractères, ou de 32 octets, sur la pile. Parce que c'est sur la pile, le compilateur sait exactement où il est en relation avec le pointeur de pile. Le compilateur va coder en dur l'adresse du tableau dans toutes les opérations qui l'utilisent; il n'est pas nécessaire pour stocker un pointeur vers elle.Il est important de noter que si vous essayez de passer cet ensemble comme un argument de fonction, il va se dégrader dans un pointeur pour le tableau, parce que le C++ ne permet pas de passage primitif tableaux de valeur. La plupart des gens qui sont nouveaux à la C++ pourrait s'attendre à passer une copie du tableau.
OriginalL'auteur Collin Dauphinee
Il y a deux manières d'aller quand vous avez besoin, par exemple, 32 octets pour stocker vos données. La différence entre ces deux versions:
est que pour la version 1 de l'espace de vos données allouées sur la tas et que vous avez de libre avant la fin du programme, alors que dans la version 2 de l'espace est sur le pile. Les deux vous donnera une variable qui pointe vers le premier octet de votre espace disponible et de cet espace est de 32 octets dans les deux cas. Les gens diront qu'il y a des raisons pour lesquelles vous pourriez vouloir choisissez l'un sur l'autre, mais c'est une autre histoire.
sizeof( firstName )
Le point intéressant est que sizeof serait de retour et c'est la taille d'un pointeur de char (dépend de votre système et le compilateur) pour la version 1 et 32 pour la version 2. Gardez à l'esprit ce qu'un autre utilisateur mentionné, en passant prénom à une fonction se dégrade en un pointeur.
OriginalL'auteur Niko
Dans la version debug il y a aussi d'octets stockés au-delà de la matrice (sur certains compilateurs) pour vérifier l'écriture après le tableau. Dans la version qu'il devrait être de 32 octets de plus un int sur la pile (probablement) pour stocker l'adresse.
Pourquoi y aurait-il besoin de stocker l'adresse sur la pile? Ce ne serait pas un
int
, si elle existait, mais plutôt unchar *
, ce qui n'est pas nécessairement la même chose.Il n'y a aucun int.
Désolé pour mon anglais, j'ai eu le cas dynamique à l'esprit quand je suis entré probablement.
OriginalL'auteur schoetbi