c avertissement du compilateur lors du passage d’un caractère * arr à une fonction en tant que const car ** arr

Voici le code:

#include  void test(const char* anagrams[]) { while(*anagrams != NULL) { printf("%s\n", *anagrams); anagrams++; } } int main() { char *arr[] = {"cat", "bat", "mate", "tac", "tab", "act", "tame", NULL}; printf("%lu\n", sizeof(arr)); test(arr); } 

Ce code génère l’avertissement suivant:

$ gcc const_char_star_star.c

 const_char_star_star.c:16:8: warning: passing 'char *[8]' to parameter of type 'const char **' discards qualifiers in nested pointer types [-Wincompatible-pointer-types-discards-qualifiers] test(arr); ^~~ const_char_star_star.c:3:23: note: passing argument to parameter 'anagrams' here void test(const char* anagrams[]) ^ 

1 avertissement généré.

Si je supprime le qualificatif const dans les arguments de test, il est compilé sans aucun avertissement.

Dupliquer de:

Avertissements de correction de double pointeur en C

Répondu dans la FAQ C:

http://c-faq.com/ansi/constmismatch.html

Copier coller exemple:

 const char c = 'x'; /* 1 */ char *p1; /* 2 */ const char **p2 = &p1; /* 3 */ *p2 = &c; /* 4 */ *p1 = 'X'; /* 5 */ 

À la ligne 3, nous affectons un caractère ** à un caractère constant **. (Le compilateur devrait se plaindre.) À la ligne 4, nous affectons un const char * à un const char *; c’est clairement légal. Dans la ligne 5, nous modifions ce à quoi un caractère * pointe – ceci est censé être légal. Cependant, p1 finit par pointer vers c, qui est const. Cela s’est produit à la ligne 4, car * p2 était vraiment p1. Cela a été défini à la ligne 3, qui est une assignation d’un formulaire non autorisé. C’est précisément pourquoi la ligne 3 est interdite.

Comme vous l’avez signalé vous-même, c’est un problème de qualificatif;

 const char *arr[] = {"cat", "bat", "mate", "tac", "tab", "act", "tame", NULL}; 

l’ajout de const à la déclaration fait également disparaître l’avertissement.

Un mot clé const indique que la valeur détenue par la variable ne peut pas être modifiée . ici

 char *arr[] = {"cat", "bat", "mate", "tac", "tab", "act", "tame", NULL}; test(arr); 

et le test de fonction est défini comme

 void test(const char* anagrams[]) 

Ce qui indique la valeur pour laquelle les points de pointeur ne peuvent pas être modifiés, de sorte que la fonction ne peut pas modifier les valeurs d’origine du tableau .

Le compilateur génère un avertissement car lors de l’appel de la fonction test(arr); il n’a pas précisé que le tableau ‘ arr ‘ est un tableau à deux dimensions const , ce qui crée une ambiguïté puisqu’un tableau char * utilisé dans la fonction principale est transmis au compilateur en tant que const char * et génère donc un avertissement comme vous l’avez spécifié.

Inoder pour éviter les avertissements déclare le tableau comme

const char *arr[] = {"cat", "bat", "mate", "tac", "tab", "act", "tame", NULL};