Char größe sizeof hat in Funktion eine andere größe?

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
darkwin
Beiträge: 26
Registriert: So Aug 08, 2021 4:37 pm

Char größe sizeof hat in Funktion eine andere größe?

Beitrag von darkwin » So Aug 15, 2021 1:31 pm

Hallo, ich habe ein Char mit 20 Zeichen und frage die größe mit sizeof ab und bekomme 20 als Antwort.
Ich hätte auch nichts anderes erwartet.
Nun habe ich eine Funktion der ich dieses Char übergebe und würde dort gern die Größe mit sizeof ermitteln.
Dort bekomme ich aber nicht aber eine andere Größe. Also nur 8 statt der 20.

Code: Alles auswählen

#include <stdio.h>

int main()
{
    char string[20];
    printf("\nstring hat die groesse %lu\n", sizeof(string));
    groesse (string);
    return 0;
    
}

void groesse (char * mystring)
{
    printf("\nstring hat die groesse %lu\n", sizeof(mystring));
}
Wie kann ich denn die Größe des Char in der Funktion ermitteln?

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Char größe sizeof hat in Funktion eine andere größe?

Beitrag von cloidnerux » So Aug 15, 2021 9:15 pm

Sizeof ist ein statischer Operator, der während des Compilierens evaluiert wird und die Größe des zugrunde liegenden Datentyps zurück gibt.
sizeof(Char Array 20 Elements) gibt daher auch das zurück, 1 Byte mal 20 für ein entsprechendes Char-Array. In deiner Funktion hast du aber einen Pointer. Pointer sind auf x64 Maschinen 8-Byte werte. Daher ist sizeof(pointer) gleich 8. Wenn du die Länge eines Strigs bestimmen möchtest gibt es die Funktion "strlen". Jedoch vorsicht, Strings sind tükisch! Dein Array hat eine Länge von 20, das weiß aber außer du und der Compiler keiner. Die Funktion "strlen" eben auch nicht. Um die Länge eines Strings zu messen wurde Eingeführt, dass ein korrekter String mit einem 0-Byte('\0', 0) terminiert wird. Daher braucht ein Text mit 10 Buchstaben 11 char-elemente, um eben auch das 0-Byte unterzubringen. "strlen" geht nun alle Elemente des Strings durch und zählt, wie viele Elemente bis zum 0-Byte kommen. Kommt kein 0-Byte zählt "strlen" einfach immer weiter im Arbeitsspeicher, liest daher irgendwas ein, bis er eine 0 findet oder dein Program mit einem Segmentation Fault beendet.

Daher ist es wichtig, deine String korrekt zu initialisieren

Code: Alles auswählen

char string[20] = {0};
Damit sind alle Elemente definitiv 0 und strlen wird korrekterweise 0 zurück geben.

Ganz offentsichtlich ist hier aber noch ein zweites Problem. Dein Array ist ja 20 Elemente lang, mit welcher Funktion könnte man das jetzt heraus finden? Die Antwort ist simpel unf Frustrierend: gar nicht. Die Länge eines Arrays musst du zwangsläufig im Code korrekt verfolgen, ansonsten gibt es Probleme. Keine Funktion wird dir sagen, dass dein String 20 Elemente speichern kann.
Redundanz macht wiederholen unnötig.
quod erat expectandum

darkwin
Beiträge: 26
Registriert: So Aug 08, 2021 4:37 pm

Re: Char größe sizeof hat in Funktion eine andere größe?

Beitrag von darkwin » Mo Aug 16, 2021 11:13 am

Vielen Dank für deine Ausführliche Antwort.
Das bestätigt alles was ich bisher herausgefunden habe.
In meinem Fall habe ich auch 0x0 Werte im Char. Somit funktioniert strlen nicht.
Ich werde mir dazu Hilfsvariablen anlegen.

Antworten