Kurze C Frage

Gast #2550038
Lesenswert?

Hallo,

wahrscheinlich nur eine Verständnisfrage, aaaber:

Mein Eclipse Cdt (gcc unter Kubuntu) frisst mir folgende Zeile nicht:
1
token = strtok(buffer, "#");

Definiert sind token und buffer wie folgt:
1
char buffer[100];
2
char token[10];

Meldung des Compilers:

error: incompatible types when assigning to type ‘char[10]’ from type 
‘char *’

Der Prototyp von strtok ist:
1
char * strtok(char *string, char *delimiters);

token ist bei mir doch ein Zeiger aufs erste Element eines Arrays von 
chars, also ein char *?!

Grüße,
bluna
Gast #2550068
Lesenswert?

Danke euch, macht Sinn.

Werd mir wohl am Besten eine eigene Funktion schreiben.

Aber trotzdem, rein vom logischen:
1
char token[10];

Damit reservier ich mir irgendwo im RAM 10 Bytes.

token zeigt mir auf das erste dieser 10 Bytes, ist also ein Zeiger auf 
char (char *).

Kann ich einen Zeiger nornal nicht anweißen, woanders hinzuzeigen?
In diesem Fall eben auf den Rückgabewert von strtok und nicht mehr auf 
meine reservierten 10 Bytes?

Ok, macht natürlich keinen Sinn das ganze, aber vom logischen her, wieso 
funkt das nicht?

Ist ein char[] in Wirklichkeit kein char  sondern ein const char ?

Grüße und Danke,
bluna
#2550101
Lesenswert?

bluna schrieb:
> token zeigt mir auf das erste dieser 10 Bytes, ist also ein Zeiger auf
> char (char *).

nein, ein Array und ein Zeiger sind nicht das gleiche.
Syntaktisch sind sie in vielen Fällen äquivalent, aber nicht immer.
Der Code den der Compiler erzeugen muss ist signifikant anders.

www.comp.nus.edu.sg/~xujia/Expert.C.Programming.pdf
da gibts ein eigenes Kapitel zu dem Thema:
Seite 86ff:
Chapter 4. The Shocking Truth: C Arrays and Pointers Are NOT the Same!
#2550116
Lesenswert?

bluna schrieb:

> Aber trotzdem, rein vom logischen:
>
>
1
char token[10];
>
> Damit reservier ich mir irgendwo im RAM 10 Bytes.

richtig.

Du hast das im Speicher erzeugt


   token
   +---+---+---+---+---+---+---+---+---+---+
   |   |   |   |   |   |   |   |   |   |   |
   +---+---+---+---+---+---+---+---+---+---+

10 Speicherzellen, denen du den Namen 'token' gegeben hast.

> token zeigt mir auf das erste dieser 10 Bytes,

nein.

> ist also ein Zeiger auf
> char (char *).

Auch nicht.
Was du hier beschreibst, würde so aussehen

   token
   +-----+
   |  o------+
   +-----+   |
             v
             +---+---+---+---+---+---+---+---+---+---+
             |   |   |   |   |   |   |   |   |   |   |
             +---+---+---+---+---+---+---+---+---+---+


und wie man sieht, ist das etwas völlig anderes.

> Kann ich einen Zeiger nornal nicht anweißen, woanders hinzuzeigen?

Du hast keinen Zeiger.
token ist der Name eines Arrays.

> Ok, macht natürlich keinen Sinn das ganze, aber vom logischen her, wieso
> funkt das nicht?

Weil du etwas missverstanden hast.
In manchen Fällen fungiert der Name eines Arrays als Zeiger auf das 
erste Element. Das bedeutet aber nicht, dass er ein Zeiger IST!
Wenn du eine Variable i hast

   int i = 5;

dann ist bei der Verwendung von i

   j = i;

immer der Inhalt (also die 5) gemeint.

Nur bei Arrays ist das anders. Hast du ein Array

  char a[10];

und verwendest du das Array 'als Ganzes'


   k = a;

dann steht dieses a hier NICHT für die Inhalte des Arrays (so wie beim 
i), sondern für die Startadresse das Arrays im Speicher. Deshalb ist a 
aber kein Pointer. a ist immer noch ein Array mit einer im Speicher 
festen Speicheradresse.
Gast #2590672
Lesenswert?

ich bin gerade über diesen Thread gestolpert, nachdem ich ein ähnliches 
Problem habe.

Viele Funktionen (zB Stringausgaben auf LCD oder USART) zählen ja den 
stringpointer hoch fürs zeichenweise ausgeben des strings.
1
while(string++)

Wenn ich in einer Funktion einen lokalen String habe und diesen 
inkrementieren will bekomme ich auch einen Compilerfehler.
1
char string[10];
2
...
3
...
4
string++;
Das geht nicht.

Ist dafür auch das von Karl Heinz Buchegger geschilderte Prinzip 
verantwortlich?

Beste Grüße, der Michl

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren