Compilerwarnung Pointertyp const char **

18/10/2009 - 16:39 von Lars Meier | Report spam
Hallo NG,

seit einiger Zeit schon habe ich ein Verstàndnisproblem im Zusammenhang
mit const und Zeigern: Hàufig schreibe ich Code zum Parsen von speziell
formatiertem Text. Dabei gibt es bestimmte Textblöcke die an mehreren
Stellen eingelesen werden. Deshalb werden diese Blöcke meist von einer
eigenen Funktion bearbeitet. Diese Funktionen erhalten dann meist die
aktuelle Leseposition im String als "char **", so dass diese die
Leseposition weitersetzen können. Dabei soll der Text nicht verànderlich
sein, ich würde also gerne den Parameter ein const verpassen. Doch wo
muss es stehen? Ich hàtte eigentlich gedacht "const char **" wàre
richtig. Doch dann meckert der Compiler. Hier ein Beispiel:

void func1(const char *s)
{
}

void func2(const char **s)
{
++(*s);
}


int main()
{
char buffer[100];
char *s = 0;

s = &buffer[10];
func1(s); // alles Bestens
func2(&s); // hier ist laut Compiler der Zeigertyp inkompatibel
return 0;
}

Der gcc sagt dazu:

cp.c:18: warning: passing argument 1 of ‘func2’ from incompatible
pointer type

Wie muss der Code richtig aussehen?

Lars
 

Lesen sie die antworten

#1 Alexander Bartolich
18/10/2009 - 18:31 | Warnen spam
Lars Meier schrieb:
[...] Dabei soll der Text nicht verànderlich
sein, ich würde also gerne den Parameter ein const verpassen. Doch wo
muss es stehen? Ich hàtte eigentlich gedacht "const char **" wàre
richtig.



Das Schlüsselwort "const" bezieht sich auf den links davor stehenden
Ausdruck, außer es steht nichts links davor, dann bezieht es sich auf
den rechts folgenden Ausdruck.

»const char **« ist also die Sonderform von »char const **« und gibt
an, dass der »char« unverànderlich ist.

[...]
void func2(const char **s)
{
++(*s);
}



Diese Funktion veràndert einen Zeiger vom Typ »char const*«, der an
der Adresse »*s« liegt.

int main()
{
char buffer[100];
char *s = 0;

s = &buffer[10];
func1(s); // alles Bestens
func2(&s); // hier ist laut Compiler der Zeigertyp inkompatibel
return 0;
}



Du Übergibst »func2« allerdings die Adresse eines Zeigers vom Typ
»char*«. Das ist nicht gestattet. Das Motiv hinter dieser Einschrànk-
ung ist vermutlich, Systeme zu ermöglichen, die unterschiedliche Bit-
muster für const-Zeiger und non-const-Zeiger verwenden.

Wie muss der Code richtig aussehen?



Rein grundsàtzlich ist deine Logik fragwürdig.
Wenn man den Code so abàndert:

const char* t = s;
func2(&t);
s = t;

bleibt immer noch »warning: assignment discards qualifiers from pointer
target type« übrig. Verfolgt man den Ansatz konsequent weiter, wird
daraus:

const char* func2(const char *s)
{
return ++s;
}
[...]
s = func2(s);

Ähnliche fragen