Forum: Compiler & IDEs sizeof() bei char[11] ?


von gast (Gast)


Lesenswert?

Was ist wenn lon nur zu haelfte gefuellt ist?
darf ich da ueberhaupt sizeof() nehmen?
oder gibt es eine funktion die nur die anzahl der zeichen vor der \0 
zaehlt?

volatile char lon[11];

sd_raw_write(myoffset,&lon,sizeof(lon));
myoffset++;
sd_raw_sync();

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

> oder gibt es eine funktion die nur die anzahl der zeichen vor der \0
> zaehlt?

strlen

von tobi (Gast)


Lesenswert?

Mit sizeof(lon) solltest du deine Adressbreite in Bytes bekommen. lon 
ist ja nur ein Pointer auf einen char, also speichert nur eine Adresse 
und ist daher auch nur so groß wie es für eine Adresse nötig ist. Das 
hat nix mit dem zu tun was hinter diesem Pointer steckt.

Wie schon gesagt sucht du strlen() aus <string.h>.

von Klaus (Gast)


Lesenswert?

quatsch. lon ist ebend kein pointer sondern ein char[11]. Das is in c 
ein kleiner aber feiner Unterschied. sizeof(lon) ist deswegen ebend 11.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

tobi schrieb:
> Mit sizeof(lon) solltest du deine Adressbreite in Bytes bekommen. lon
> ist ja nur ein Pointer auf einen char, also speichert nur eine Adresse
> und ist daher auch nur so groß wie es für eine Adresse nötig ist. Das
> hat nix mit dem zu tun was hinter diesem Pointer steckt.

Nein. lon ist kein Zeiger auf char. sizeof(lon) ist 11.

Übrigens ist sizeof keine Funktion sondern ein Operator, der auf Typen 
angewandt wird, etwa
1
size_t s = sizeof (int);

Johann

von Kopfnuss (Gast)


Lesenswert?

Interessant wie oft hier dem Wort "Quatsch" ebensolcher folgt.

>quatsch. lon ist ebend kein pointer sondern ein char[11]. Das is in c
>ein kleiner aber feiner Unterschied.
In gewissen Kontexten ist das das selbe; kann lon wie ein Zeiger 
verwendet werden. Z.B. ist &lon[0] das selbe wie lon.

>sizeof(lon) ist deswegen ebend 11.
Das ist allerdings richtig.

Der Fragesteller schrieb jedoch:

>Was ist wenn lon nur zu haelfte gefuellt ist?
>darf ich da ueberhaupt sizeof() nehmen?
>oder gibt es eine funktion die nur die anzahl der zeichen vor der \0
>zaehlt?
Und die Antwort ist: Nein. Denn sizeof gibt die deklarierte Länge 
wieder, wenn sie zur Compilezeit bekannt ist. Nicht aber die Position 
der 0 (des Terminierungszeichens).

Unabhängig davon, wünschte ich, das die Verwendung des Wortes "Quatsch" 
eingeschränkt, oder noch besser, aufgegeben wird. Ich empfinde das als 
Beleidigend.

von Simon K. (simon) Benutzerseite


Lesenswert?

Kopfnuss schrieb:
> Interessant wie oft hier dem Wort "Quatsch" ebensolcher folgt.
>
>>quatsch. lon ist ebend kein pointer sondern ein char[11]. Das is in c
>>ein kleiner aber feiner Unterschied.
> In gewissen Kontexten ist das das selbe; kann lon wie ein Zeiger
> verwendet werden. Z.B. ist &lon[0] das selbe wie lon.

Hä? Was hat das eine mit dem anderen zu tun? *&lon[0]* ist nicht lon.

Und lon ist eben ein char[11] und kein Pointer und das ist auch 
vollkommen richtig so. Da gibts nix dran zu drehen.

von Stefan (Gast)


Lesenswert?

Ist es schonmal vorgekommen das Oberstudienrat Simon sich zu einer Frage 
äußert anstatt eine Antwort zu kommentieren?

von Sven P. (Gast)


Lesenswert?

Er hat aber Recht, lon ist ein Vektor und kein Zeiger. Aber ein Vektor 
kann in bestimmten Kontexten zu einem Zeiger zerfallen, aber nicht 
immer.

von Simon K. (simon) Benutzerseite


Lesenswert?

Stefan schrieb:
> Ist es schonmal vorgekommen das Oberstudienrat Simon sich zu einer Frage
> äußert anstatt eine Antwort zu kommentieren?

Bin immer zu spät ;)

von Simon K. (simon) Benutzerseite


Lesenswert?

Sven P. schrieb:
> Er hat aber Recht, lon ist ein Vektor und kein Zeiger. Aber ein Vektor
> kann in bestimmten Kontexten zu einem Zeiger zerfallen, aber nicht
> immer.

Kopfnuss:
> >quatsch. lon ist ebend kein pointer sondern ein char[11]. Das is in c
> >ein kleiner aber feiner Unterschied.
> In gewissen Kontexten ist das das selbe; kann lon wie ein Zeiger
> verwendet werden. Z.B. ist &lon[0] das selbe wie lon.


Ja, das schon. Aber, und das finde ich, ist ein wichtiges Detail, 
konvertiert das "Objekt" lon unter keinsten Umständen zu einem 
Pointer. Der Compier kann den Arraynamen zu einen Pointer konvertieren, 
dieser Pointer ist aber nicht unter lon gespeichert und deswegen kann 
man in diesem Fall lon nach wie vor nicht als Pointer behandeln. Und 
deswegen gibt sizeof bei lon nach wie vor auch die Größe des Arrays 
zurück, weil es immer noch ein Array ist.
Der Pointer, in welcher das Array mal konvertiert wurde, liegt irgendwo 
flüchtig im Register oder RAM. Auf den kann man aber nicht zugreifen.

Und ich denke darum ging es hier.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.