Hallo zusammen
Ich verstehe momentan nicht, warum in C ein impliziter Cast von char **
zu const char ** eine Warnung erzeugt.
Ich möchte einer Funktion einen Zeiger auf ein Zeigerarray übergeben.
Manchmal sind die Strings, auf die die Zeiger im Array zeigen, konstant,
manchmal nicht (dynamisch erzeugt). Dazu habe ich folgendes
Minimalbeispiel erstellt:
1 | void foo(const char * const * ptr){
|
2 | ptr = ptr;
|
3 | }
|
4 |
|
5 | int main(void){
|
6 | char ** ptr;
|
7 |
|
8 | foo(ptr);
|
9 |
|
10 | return 0;
|
11 | }
|
Bei der Übergabe von ptr an foo erzeugt der Compiler folgende Warnung:
1 | [Warning] passing argument 1 of 'foo' from incompatible pointer type [enabled by default]
|
2 | [Note] expected 'const char * const*' but argument is of type 'char **'
|
Auch eine direkte Zuweisung bemängelt der Compiler:
1 | int main(void){
|
2 | const char ** ptr1;
|
3 | char ** ptr2;
|
4 |
|
5 | ptr1 = ptr2;
|
6 |
|
7 | return 0;
|
8 | }
|
Dies erzeugt folgende Warnung:
1 | [Warning] assignment from incompatible pointer type [enabled by default]
|
Da der Compiler eine Warnung erzeugt, gehe ich davon aus, dass ein char
** nicht ohne Probleme zu einem const char ** umgewandelt werden kann
und somit nicht dasselbe ist.
Daraus ergeben sich für mich zwei Fragen:
1. Warum ist das so?
2. Wie kann ich das Problem umgehen?
Compiler: TDM-GCC 4.8.1 32-bit Release
Parameter: -Ofast -m32 -std=c99 -Wall -Wextra -pedantic