Fragen zu sizeof()

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.

Re: Fragen zu sizeof()

Beitragvon joggel » 03.08.2017, 13:49

Was möchtest Du mir jetzt damit und dem Bild sagen, Krishty?

Ich meine, das hat doch Starcow schon gesagt. Und wie viele Byte ein Zeiger auf einem 64Bit-System hat...ist ja klar.
Oder soll ich Dir das jetzt hier wie so ein dämliches Kleinkind beantworten???
...
Benutzeravatar
joggel
Establishment
 
Beiträge: 1178
Registriert: 06.11.2007, 19:06
Wohnort: Dresden

Re: Fragen zu sizeof()

Beitragvon MasterQ32 » 03.08.2017, 13:54

Naja, dein Tipp mit strlen war eben auch nicht grade hilfreich, den das bestimmte die Länge des Strings und nicht die größe des Arrays bzw. des verfügbaren Speichers:

Code: Ansicht erweitern :: Alles auswählen

char buffer[64];
strcpy(buffer, "kek");
char * pointer = buffer;

sizeof(buffer) // = 64
sizeof(pointer) // = 4
strlen(buffer) // = 3
strlen(pointer) // = 3

 
Duct tape is like the force. It has a light side, a dark side, and it holds the world together.
Benutzeravatar
MasterQ32
Felix Queißner
Establishment
 
Beiträge: 958
Registriert: 07.10.2012, 14:56

Re: Fragen zu sizeof()

Beitragvon joggel » 03.08.2017, 13:56

MasterQ32 hat geschrieben:Naja, dein Tipp mit strlen war eben auch nicht grade hilfreich, den das bestimmte die Länge des Strings und nicht die größe des Arrays bzw. des verfügbaren Speichers:

Habe ich doch geschrieben....
...
Benutzeravatar
joggel
Establishment
 
Beiträge: 1178
Registriert: 06.11.2007, 19:06
Wohnort: Dresden

Re: Fragen zu sizeof()

Beitragvon joggel » 03.08.2017, 13:59

Nur was möchte starcow?
Die länge des Strings?
Code: Ansicht erweitern :: Alles auswählen
char* buffer = "Hallo";

oder die länge des Arrays?

Wie man die Länge des Strings ermittelt, habe ich einen Tipp gegeben...
Okay, ich habe es fälschlicher Weise nicht "String" genannt, sonder "Array".... SORRY!!! :shock:
...
Benutzeravatar
joggel
Establishment
 
Beiträge: 1178
Registriert: 06.11.2007, 19:06
Wohnort: Dresden

Re: Fragen zu sizeof()

Beitragvon Krishty » 03.08.2017, 14:01

Du warst dir nicht sicher („ich glaube“) und Starcow auch nicht, und ich habe bestätigt, dass Starcow recht hat und du haarsträubend daneben lagst ;)
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Krishty
Establishment
 
Beiträge: 6040
Registriert: 26.02.2009, 12:18
Benutzertext: state is the enemy

Re: Fragen zu sizeof()

Beitragvon joggel » 03.08.2017, 14:01

Krishty hat geschrieben:Du warst dir nicht sicher („ich glaube“) und Starcow auch nicht, und ich habe bestätigt, dass Starcow recht hat und du haarsträubend daneben lagst ;)

Achso...
...
Benutzeravatar
joggel
Establishment
 
Beiträge: 1178
Registriert: 06.11.2007, 19:06
Wohnort: Dresden

Re: Fragen zu sizeof()

Beitragvon dot » 03.08.2017, 14:20

Krishty hat geschrieben:Die Länge eines Arrays kannst du via sizeof array / sizeof array[0] ermitteln. Beachte, dass bei char-Arrays die abschließende Null mitgezählt wird!

Oder in C++ mit std::extent<decltype(array)>::value, bzw. ab C++ 17 mit std::extent_v<decltype(array)>
Benutzeravatar
dot
Michael Kenzel
Establishment
 
Beiträge: 1591
Registriert: 06.03.2004, 19:10

Re: Fragen zu sizeof()

Beitragvon starcow » 10.08.2017, 12:48

Entschuldigt, dass ich nochmals nachfragen muss:

Krishty hat geschrieben:Die Länge eines Arrays kannst du via sizeof array / sizeof array[0] ermitteln. Beachte, dass bei char-Arrays die abschließende Null mitgezählt wird!


Also irgendwie verstehe ich nicht ganz, worin der Unterschied liegt, zu meinem ersten Versuch (welcher ja so nicht zu funktionieren scheint).

Was ja bekanntlich klappt ist folgendes:
Code: Ansicht erweitern :: Alles auswählen

char buffer[] = "Hallo";
cout << sizeof buffer;


Was aber nicht zu funktionieren scheint ist:
Code: Ansicht erweitern :: Alles auswählen

char* buffer = "Hallo";
cout sizeof buffer;


Ich hänge aber an der ersten Variante - denn:
Code: Ansicht erweitern :: Alles auswählen

char buffer[] = "Hallo";
char* buffer2 = buffer;
cout sizeof buffer2;


Wenn das funktionieren würde, könnte man die Grösse des Buffers auch in einer anderen Funktion bestimmen und nutzen

Code: Ansicht erweitern :: Alles auswählen

int Groesse(const char* const buffer)
{
return sizeof buffer;
}

char buffer[] = "Hallo";
cout << Groesse(buffer);


Aber vielleicht, ist eine solche Methode schlicht gar nicht möglich?
Alternativ könnte man die Grösse eines Strings ja sehr einfach ermitteln, indem man das Array durchgeht, bis man auf die 0-Terminierung trifft.
Nur kann ich mich wirklich in _jedem_ Fall darauf verlassen, das ein C-String (char Array) ausnahmslos mit einer 0 beendet wird?
Oder begebe ich mich da in einen Bereich der riskanten Programmierung? :)

Gruss starcow
Freelancer 3D- und 2D-Grafik
mischaschaub.com
Benutzeravatar
starcow
Establishment
 
Beiträge: 187
Registriert: 23.04.2003, 17:42

Re: Fragen zu sizeof()

Beitragvon MasterQ32 » 10.08.2017, 13:32

Hey!

Annahme: Wir befinden uns auf einem 32-Bit-System, also sizeof(void*) = 4

Code: Ansicht erweitern :: Alles auswählen

char buffer_a[] = "Hallo";
char* buffer_b = buffer_a;
cout << sizeof(buffer_a); // (a) → 6
cout << sizeof(buffer_b); // (b) → 4


Der Unterschied hier zwischen (a) und (b) ist der folgende:
(a) besitzt den Typen char[6], wohingegen (b) den Typen char* besitzt. Da sizeof zur Compilezeit ausgeführt wird und nur die Größe des angegeben Ausdrucks oder Typen bestimmt (und den Inhalt komplett ignoriert, es wird kein Code emittiert), hast du hier den zu erwartenden Unterschied.

Bei deinem Beispiel
Code: Ansicht erweitern :: Alles auswählen

int Groesse(const char* const buffer)
{
return sizeof buffer;
}

char buffer[] = "Hallo";
cout << Groesse(buffer);

liefert Groesse immer 4 zurück, da der Parameter buffer ignoriert wird. Der Compiler gibt also folgende Funktion aus:

Code: Ansicht erweitern :: Alles auswählen

int Groesse(const char* const buffer)
{
return 4;
}


Damit ist die Antwort auf deine Frage "Aber vielleicht, ist eine solche Methode schlicht gar nicht möglich?" ein Nein, diese Methode ist nicht möglich

Nur kann ich mich wirklich in _jedem_ Fall darauf verlassen, das ein C-String (char Array) ausnahmslos mit einer 0 beendet wird?

Nein, du kannst dich nicht darauf verlassen, dass deine Strings immer mit einer 0 beendet werden. Wenn dies nicht so ist, wird ein Programm so lange den String absuchen, bis es eine 0 im Speicher findet. Aber auch Funktionen wie strlen prüfen das nicht, das liegt in der Verantwortung des Aufrufers.

Falls du dich aber absichern willst, kannst du strlen_s verwenden, welches eine maximale Länge des Speichers angibt.

Grüße
Felix
Duct tape is like the force. It has a light side, a dark side, and it holds the world together.
Benutzeravatar
MasterQ32
Felix Queißner
Establishment
 
Beiträge: 958
Registriert: 07.10.2012, 14:56

Re: Fragen zu sizeof()

Beitragvon Krishty » 10.08.2017, 13:43

MasterQ32 hat geschrieben:
Nur kann ich mich wirklich in _jedem_ Fall darauf verlassen, das ein C-String (char Array) ausnahmslos mit einer 0 beendet wird?

Nein, du kannst dich nicht darauf verlassen, dass deine Strings immer mit einer 0 beendet werden. Wenn dies nicht so ist, wird ein Programm so lange den String absuchen, bis es eine 0 im Speicher findet. Aber auch Funktionen wie strlen prüfen das nicht, das liegt in der Verantwortung des Aufrufers.
Ich schätze, er meinte die Frage anders: Wenn er sowas wie char * s = "foobar" hinschreibt – also eine String-Konstante – ist die immer mit Null abgeschlossen? Und ja, das garantiert der Compiler dir. Sobald du irgendwie am String rumfummelst, ist die Garantie aber futsch.

(Im Gegensatz zu std::string, bei dem alle Operationen weiterhin garantieren, dass size() die tatsächliche Länge zurückgibt.)
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Krishty
Establishment
 
Beiträge: 6040
Registriert: 26.02.2009, 12:18
Benutzertext: state is the enemy

Re: Fragen zu sizeof()

Beitragvon starcow » 10.08.2017, 15:27

Ok, Danke für die Erläuterungen!
Ich leite jetzt daran folgende Schlussfolgerung ab:

Wenn ich ein Array (per Zeiger auf das erste Element) an eine Funktion weitergebe, habe ich _keine_ Möglichkeit, die Grösse dieses Arrays in der Funktion selbst zu ermitteln.
Ich müsste demnach die Grösse des Array zuvor per sizeof ermitteln und den ermittelten Wert per Parameter an die Funktion mitgeben.
Oder - bei einem String - mich darauf verlassen, dass das Array mit einem 0-Wert als abgeschlossen markiert wird.

Ist das so richtig?

Gruss starcow
Zuletzt geändert von starcow am 10.08.2017, 19:41, insgesamt 1-mal geändert.
Freelancer 3D- und 2D-Grafik
mischaschaub.com
Benutzeravatar
starcow
Establishment
 
Beiträge: 187
Registriert: 23.04.2003, 17:42

Re: Fragen zu sizeof()

Beitragvon Krishty » 10.08.2017, 15:32

Ja. Sobald du das Array an eine Funktion übergibst, erhält die nur einen Zeiger. Aus ihrer Sicht ist es kein Array mehr und du kannst auch nicht mehr die Größe feststellen.

Es gibt noch eine Lösung über Templates, aber dann wird die Syntax richtig hässlich ;)
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Krishty
Establishment
 
Beiträge: 6040
Registriert: 26.02.2009, 12:18
Benutzertext: state is the enemy

Re: Fragen zu sizeof()

Beitragvon dot » 10.08.2017, 15:35

starcow hat geschrieben:Ist das so richtig?

ja
Benutzeravatar
dot
Michael Kenzel
Establishment
 
Beiträge: 1591
Registriert: 06.03.2004, 19:10

Vorherige

Zurück zu Programmiersprachen, Quelltext und Bibliotheken

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 Gäste