web-dev-qa-db-fra.com

Comment obtenir la longueur d'un tableau à partir d'un pointeur?

J'ai du mal à trouver la longueur d'un tableau de pointeurs. Disons que j'ai:

char array[40] = "hello"; // size 40
int length =  sizeof array / sizeof array[0]; // no problem returns 40

// Comment obtenir la longueur du tableau avec seulement un pointeur sur le premier élément de ce tableau?

 char* pchar = array;

//si

std::strlen(pchar); // this returns the length of 5... i want length 40

//si

int count = 0;
while(true)
{
  if(*(pchar + count) == '\0') // returns 5...
    break;
   count++;
}

Comment puis-je obtenir qu'il retourne la longueur 40 juste à partir d'un pointeur vers le premier élément du tableau?
J'ai trouvé que je pouvais faire ça.

int count = 0;
    while(true)
    {
      if(*(pchar + count) == '\0' && *(pchar + count + 1) != '\0') 
             break;

       count++;
    }

Cela renvoie 39, c'est bien mais j'ai l'impression que cela peut être bogué dans certaines situations.

17
Anthony Raimondo

Tu ne peux pas, j'ai peur. Vous devez transmettre la longueur du tableau à tous ceux qui en ont besoin. Ou vous pouvez utiliser un std::array ou std::vector ou similaire, qui conservent eux-mêmes la longueur.

17
RichieHindle

C++ a le type de chaîne approprié:

std::string

que vous trouverez peut-être utile ici. Même si vous le passez à une fonction qui accepte const char*, Il a la méthode .c_str() qui vous permet de le passer à une fonction qui accepte un pointeur. Si l'autre fonction doit modifier la chaîne, vous pouvez utiliser &str[0] Qui est valide pour de nombreuses implémentations de C++ et est requis pour fonctionner pour C++ 11. Assurez-vous simplement de les redimensionner () à la bonne taille.

Certains des autres conteneurs en C++ sont:

std::array (C++ 11) Tableau de taille constante. Mieux que le vieux tableau C ordinaire, car il a la méthode size(). std::vector Tableau dynamique (Java ArrayList équivalent)

Quant à votre question - il n'y a aucun moyen de trouver la taille d'un tableau pointé. Comment as-tu pu faire ça? C'est juste un pointeur stupide.

5
milleniumbug

Il est vrai que vous ne pouvez pas obtenir la taille d'un tableau à partir d'un pointeur vers un élément du tableau.

Si la raison pour laquelle vous n'avez qu'un pointeur est que vous implémentez une fonction qui prend un paramètre de tableau comme argument comme ceci:

void foo (T *p) {
    // p is a pointer to T
}

vous pouvez alors utiliser une fonction de modèle à la place pour obtenir la taille du tableau de la fonction.

template <unsigned N, typename T>
void foo (T (&p)[N]) {
    // p is a reference to an array[N] of T
    std::cout << "array has " << N << " elements" << std::endl;
    std::cout << "array has "
              << sizeof(p)/sizeof(p[0])
              << " elements"
              << std::endl;
}

int main ()
{
    int array[40];
    char array2[25];
    foo(array);
    foo(array2);
    return 0;
}
4
jxh

Tu ne peux pas. Et la morale est, n'utilisez pas de pointeurs et de tableaux, utilisez des vecteurs. Vous pouvez toujours obtenir la taille d'un vecteur.

3
john

Si vous voulez rester simple et ne pas utiliser #include <array.h>, vous pouvez créer une structure où se trouvent les tailles de votre tableau. Un peu comme:

struct
{
    int* int_Array;
    int array_Size;
}

De cette façon, vous pouvez faire ce que vous voulez (comme supprimer vos instances ou quelque chose)

0
Sirmyself