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
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