und Sie werden nicht die gleiche Warnung. Alternativ können Sie v
werfen, wenn Sie f
Sie können ein verwenden pointer-to-T
(für jede Art T
), wo ein pointer-to-const-T
erwartet wird. Die Regel (eine explizite Ausnahme), die geringfügige Fehlanpassungen in qualifizierten Zeigertypen zulässt, wird jedoch nicht rekursiv angewendet, sondern nur auf der obersten Ebene. (const char **
ist pointer-to-pointer-to-const-char
, und die Ausnahme daher nicht gilt.)
Der Grund, dass Sie einen char **
Wert auf einen const char **
Zeiger nicht zuordnen kann etwas unklar ist. Da der const
Qualifier überhaupt existiert, möchte der Compiler Ihnen helfen, Ihre Versprechen einzuhalten, die Werte const
nicht zu ändern. Deshalb können Sie eine char *
einer const char *
zuweisen, aber nicht anders herum: es ist eindeutig sicher const
-ness zu einem einfachen Zeiger, aber es wäre gefährlich, es wegzunehmen. Allerdings nehme an, Sie die folgende kompliziertere Reihe von Aufgaben durchgeführt:
const char c = 'x'; /* 1 */
char *p1; /* 2 */
const char **p2 = &p1; /* 3 */
*p2 = &c; /* 4 */
*p1 = 'X'; /* 5 */
In Zeile 3, weisen wir eine char **
zu einem const char **
. (Der Compiler sollte sich beschweren.) In Zeile 4 weisen wir const char *
einem const char *
zu; das ist eindeutig legal. In Zeile 5 modifizieren wir, was ein char *
zeigt - das soll legal sein. Jedoch zeigt p1 auf c, was const
ist. Dies geschah in Zeile 4, weil * p2 wirklich p1 war. Dies wurde in Zeile 3 festgelegt, die eine Zuweisung einer Form ist, die nicht erlaubt ist, und gerade deshalb ist Zeile 3 nicht erlaubt.
Das Zuweisen einer char **
zu einer const char **
(wie in Zeile 3 und in der ursprünglichen Frage) ist nicht sofort gefährlich. Aber es schafft eine Situation, in der das Versprechen von p2 - dass der letztlich auf den Wert hinweisende Wert nicht geändert wird - nicht eingehalten werden kann.
(C++ hat kompliziertere Regeln für const
, Qualifizierte Zeiger zuweisen, die können Sie mehrere Arten von Aufgaben ohne Warnungen zu verursachen, aber immer noch Schutz vor unbeabsichtigten Versuche machen const
Werte zu ändern. C++ erlauben würde, noch nicht char **
einen const char **
zuweisen , aber es würde Sie weg mit Zuweisung eines char **
zu einem const char * const
* lassen.)
In C, wenn man sich andere Hinweise, die Qualifier Mismatches haben als die erste Dereferenzierungsebene zuweisen oder übergeben müssen, müssen Sie explizite Casts verwenden (z. B. (const char **
) in diesem Fall), obwohl wie immer die Notwendigkeit für eine solche Besetzung eine tiefere anzeigen kann Problem, das die Besetzung nicht wirklich beheben kann.
Referenzen: ISO Sec. 6.1.2.6, Sec. 6.3.16.1, Sek. 6.5.3 H & S sek. . 7.9.1 pp 221-2
In welcher Zeile wird die Warnung angezeigt? – LeopardSkinPillBoxHat