1
votes

Comment calculer la taille de la chaîne allouée statiquement dans la fonction appelante en C?

Comment obtenir la valeur 200 dans la fonction check_size?

#include <stdio.h>
#include <string.h>
int check_size(char *ptr)
{
    //if (sizeof(ptr) == 200)
    //{
    //   ...
    //}
    printf("%ld \n", sizeof(ptr));
    printf("%ld \n", sizeof(*ptr));
    printf("%ld \n", strlen(ptr));

    return 1;
}
int main()
{
    char ptr[200]="\0";

    int s = check_size(ptr);
    return 0;
}


3 commentaires

Il n'y a aucun moyen de faire cela sans utiliser un pointeur intelligent.


Dans ce code, ptr n'est pas une mémoire allouée dynamiquement. Pas sûr à 100%, l'exécution du programme échouera même si le système d'exploitation ne parvient pas à allouer 200 octets de mémoire. Donc, en parlant d'un système d'exploitation cohérent, vous pouvez être sûr que vous avez 200 octets de mémoire alloués, une fois que le processus est opérationnel.


Le spécificateur de format correct pour size_t , qui est ce que renvoient à la fois sizeof () et strlen () , est % zu .


4 Réponses :


3
votes

Lorsqu'un tableau est utilisé comme argument de fonction, il est converti en pointeur vers son premier élément. Par conséquent, une fonction ne peut pas obtenir la taille d'un tableau passé en paramètre.

Concernant vos tentatives:

printf("%ld \n", strlen(ptr));

Comme ptr est un char * cela vous donnera la taille de ce pointeur (généralement 8).

printf("%ld \n", sizeof(*ptr));

Cela vous donnera la taille de quoi ptr pointe vers, en particulier un char qui est défini comme étant 1.

printf("%ld \n", sizeof(ptr));

En supposant des points ptr à une chaîne terminée par un nul, cela vous donnera la longueur de la chaîne.

La taille du tableau doit être transmise en tant que paramètre séparé pour que la fonction le sache. L'expression sizeof (ptr) si elle est utilisée dans main vous donnera la taille du tableau en octets.


3 commentaires

Oui, j'obtiens 0 pour la dernière instruction d'impression. Alors, que dois-je passer comme argument à la fonction check_size afin de vérifier que la taille du tableau de caractères passé est allouée pour 200?


@Sethuraman C'est le problème, vous ne pouvez pas. Vous ne pouvez utiliser sizeof que sur le tableau dans la portée où il a été défini. Ainsi, toute fonction qui a besoin de connaître la taille d'un tableau doit la faire passer explicitement.


Merci pour la clarification. Je comprends maintenant que c'est une lacune de C.



0
votes

Quelque chose à clarifier: il n'y a pas de concept de "taille de tableau" pour la fonction appelée. Tout ce qu'il est donné est un pointeur vers un octet.

Maintenant, si vous deviez donner au tableau une initialisation particulière, comme une chaîne de 199 caractères, vous pouvez le faire avec strlen () . Ou vous pouvez passer la taille du tableau, bien que ce soit trivial.

Dans l'ensemble cependant, il n'y a aucun moyen de faire exactement ce que vous voulez ici.


0 commentaires

0
votes

Comment obtenir la valeur 200 dans la fonction check_size?

Plutôt que d'avoir une fonction acceptant un char * , ayez une fonction qui accepte un pointeur vers le tableau 200 de char.

8 
200 
0 

Sortie p>

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

int check_size(char (*ptr)[200]) {
  printf("%zu \n", sizeof(ptr));
  printf("%zu \n", sizeof(*ptr));
  printf("%zu \n", strlen(*ptr));
  return 1;
}

int main() {
  char ptr[200] = "\0";
  check_size(&ptr);
  return 0;
}

GTG


0 commentaires

1
votes

Comment obtenir la valeur 200 dans la fonction check_size ? Comment calculer la taille de la chaîne allouée statiquement dans la fonction appelante en C?

Puisque la taille de ptr est connue au moment de la compilation et que vous devez également coder en dur les littéraux entiers le moins possible dans n'importe quel code source, utilisez simplement une macro constante pour contenir la quantité d'éléments. Avec cela, vous pouvez facilement calculer la taille du tableau dans la fonction check_size():

Exemple de programme

1 
200 
8 
0 

Output:

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

#define length 200                            // macro constant `length`.

int check_size(char *ptr)
{
    printf("%zu \n", sizeof(*ptr));           // size of `char`
    printf("%zu \n", sizeof(*ptr) * length);  // size of the array.
    printf("%zu \n", sizeof(ptr));            // size of the pointer to `char`.
    printf("%zu \n", strlen(ptr));            // length of the string.

    return 1;
}

int main()
{
    char ptr[length] = "\0";                  // macros can be used here.

    check_size(ptr);
    return 0;
}

1 commentaires

Cela me semble être une solution réalisable. En utilisant une définition de longueur globale commune aux fonctions appelées et appelantes. Merci.