0
votes

Comment initialiser et accéder à un const Char * Const *

J'ai vu un code C ++ où une structure est définie comme ci-dessous avec Weird const char * const * xxx

Je dois utiliser la structure ci-dessus et renvoyer un objet de celui-ci à partir d'une fonction. Mais pour cette façon d'initialiser la variable texte à une chaîne constante? En outre, comment accéder à la chaîne pointée par texte à partir de la fonction de l'appelant. xxx


0 commentaires

3 Réponses :


2
votes

Vous ne pouvez pas attribuer à une variable constante, mais vous pouvez initialiser une telle variable: xxx


4 commentaires

Cela donne l'erreur une valeur de type "const char *" ne peut pas être utilisée pour initialiser une entité de type "const char * const *"


Oh, super, et comment accéder / imprimer la chaîne de la fonction principale?


STD :: COUT << ** Struct_obj.text << std :: endl; imprime uniquement le premier caractère.


@KaAustav c'est parce que vous dréérence le pointeur deux fois. Une fois pour la chaîne, une seconde fois pour le premier élément de la chaîne.



2
votes

Les constantes sont immuables, elles ne peuvent donc pas être assignées. Ils ne peuvent être initialisés que. Pour renvoyer une telle structure d'une fonction, vous pouvez utiliser l'initialisation globale (initialisation de la corset bouclé). Cette structure peut être initialisée avec n'importe quel char * **, mais celui-ci ne peut être lu que sur le char * **, mais ne peut pas le modifier.

TestStruct TestFunction() 
{
    char** lines = new char*[2];
    // Work with char** stored in lines
    *(lines + 0) = new char[10];
    *(lines + 1) = new char[20];
    void* data = nullptr;
    return TestStruct{ lines , data };
}

int main()
{
   TestStruct my_struct = TestFunction();
   // const char* const * means it's an immutable array of immutable CStrings
   const char* line_one = *my_struct.text;
   const char* line_two = *(my_struct.text + 1);
  
   std::cout << line_one << std::endl;
   std::cout << line_two << std::endl;
}


2 commentaires

Mais comment libérer la mémoire allouée par Nouveau Char [x] Déclarations?


Vous pouvez const_cast et faire la suppression [] pour chaque ligne. Mais vous ne devriez pas gérer cette mémoire à travers une structure comme celle-là. Les constitus sont là pour exprimer que l'appelant est le propriétaire de la mémoire. L'appelant devrait donc gérer sa vie. Habituellement, vous avez un "" "Code" "" "Code qui contient un char * ** quelque part et qu'il construit et expédient de telles structures à d'autres coccles à des fins en lecture seule



0
votes
TestStruct struct_obj;
...
(char*&)struct_obj.text = "works";


0 commentaires