mikrocontroller.net

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


Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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();

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

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

strlen

Autor: tobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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>.

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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
size_t s = sizeof (int);

Johann

Autor: Kopfnuss (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan (Gast)
Datum:

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

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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 ;)

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.