web-dev-qa-db-fra.com

sizeof pour un caractère const terminé par un caractère nul *

const char* a;

comment puis-je m'assurer que la chaîne "a" est terminée par null? quand a = "abcd" et que je fais sizeof (a), j'obtiens 4. Est-ce à dire que ce n'est pas terminé par null? si c'était le cas, j'en aurais eu 5?

20
hari

Si vous recevez un tableau de caractères contenant ou non des données à terminaison nulle, il n'y a vraiment pas de bon moyen de vérifier. Le mieux que vous puissiez faire est de rechercher un caractère nul jusqu'à une longueur spécifiée par certian (pas indéfiniment!). Mais 0 n'est pas exactement un octet de données inhabituel à trouver dans une zone de mémoire non initialisée.

C'est l'une des nombreuses choses sur la norme de chaîne de facto de C que beaucoup de gens n'aiment pas. Trouver la longueur d'une chaîne qu'un client vous tend est au mieux une opération de recherche O(n)) et au pire une erreur de segmentation.

Un autre problème est bien sûr que les tableaux et les pointeurs sont interchangeables. Cela signifie que array_name + 2 Est identique à &(array_name[2]) et sizeof(a) est sizeof(char*), pas la longueur du tableau.

5
T.E.D.

sizeof(a) vous donne la taille du pointeur, pas du tableau de caractères vers lequel le pointeur pointe. C'est la même chose que si vous aviez dit sizeof(char*).

Vous devez utiliser strlen() pour calculer la longueur d'une chaîne terminée par un caractère nul (notez que la longueur renvoyée ne fait pas inclut le terminateur nul, donc strlen("abcd") est 4, pas 5). Ou, vous pouvez initialiser un tableau avec le littéral de chaîne:

char a[] = "abcd";
size_t sizeof_a = sizeof(a); // sizeof_a is 5, because 'a' is an array not a pointer

La chaîne littérale "abcd" est terminé par null; tous les littéraux de chaîne sont terminés par null.

31
James McNellis

Vous obtenez 4 car c'est la taille d'un pointeur sur votre système. Si vous voulez obtenir la longueur d'une chaîne terminée par nul, vous voulez la fonction strlen dans la bibliothèque standard C.

12
jer

Le problème ici est que vous confondez sizeof() qui est une opération de compilation avec la longueur d'une chaîne qui est une opération d'exécution. La raison pour laquelle vous récupérez 4 lorsque vous exécutez sizeof(a) est que a est un pointeur et la taille typique d'un pointeur en C est de 4 octets. Pour obtenir la longueur de la chaîne, utilisez strlen.

Pour la deuxième question, comment vous assurer qu'une chaîne est terminée par null. La seule façon de le faire définitivement est d'annuler vous-même la chaîne. Étant donné seulement un char* il n'y a aucun moyen de garantir à 100% qu'il est correctement terminé. Un grand soin doit être pris pour assurer le contrat entre le producteur et le consommateur du char* signifie qui termine la chaîne.

6
JaredPar

sizeof(a) est sizeof(const char*), la taille du pointeur. Il n'est pas affecté par le contenu de a. Pour cela, vous voulez strlen.

En outre, tous les littéraux de chaîne entre guillemets doubles comme votre "abcd" dans le code source sont automatiquement nuls.

4
aschepler

sizeof (a) renvoie la taille du const char *a ... pas la taille de ce qu'il pointe. Vous pouvez utiliser strlen(a) pour calculer la longueur de la chaîne terminée par null et non, le résultat de strlen n'inclut pas le null-terminator.

1
semaj