Die Ursache liegt in der Dir fehlenden Differenzierung zwischen Vektor
und Zeiger. Ihr ist in K&R, ein ganzes Kapitel gewidmet, das Du mal
lesen solltest, ebenso wie die Beschreibung von sizeof dort.
In main ist lengthvalue ein Vektor, was als Argument von sizeof eben die
definierte Länge des Vektors ergibt. In der Funktion allerdings hast Du
aus dem Vektor einen Zeiger auf char gemacht, dessen Grösse sizeof
korrekt als Grösse des Zeigers angibt, nicht des Vektors. Die
Information, ob und wieviele chars denn auf den ersten folgen, ist
verlorengegangen.
sizeof, angewendet auf Vektoren, wertet zur Compile-Zeit, nur die
definierten Längen dieser Vektoren aus, also die in der eckigen Klammer
ausdrücklich angegebene Länge.
Es ist, nach oberflächlichem Studium, verführerisch, anzunehmen, das
sizeof ein bequemer Ersatz für strlen ist, mit dem man zur Compile-Zeit
sowohl Vektor- als auch String-Längen ermitteln kann, weil zwischen
diesen kein wesentlicher Unterschied zu bestehen scheint. Dem ist aber
nicht grundsätzlich so.
Das gilt auch, obwohl einige Unterschiede nur deswegen gültig zu sein
scheinen, weil sie definiert worden sind, aber intuitiv kein
funktionaler Grund zur Definition dieses Unterschieds vorzuliegen
scheint.
So könnte man unterstellen, das der Compiler wissen müsste, das ein
Zeiger auf einen Vektor auf einen Speicherbereich mit der Länge des
ursprünglichen Vektors verweist. Aber dann bliebe die Frage, wie man mit
sizeof die Länge eines Zeigers auf einen String ermittelt, bzw. eine
Ungleicheit in der Behandlung von Zeigern auf Vektoren im Gegensatz zu
andere Typen.
So aber, in dem man die einmal festgesetzte Unterscheidung zwischen
Vektor und String-Array auch im Zusammenhang mit sizeof bzw. der
Typumwandlung zwischen beiden, beibehält, bleibt man konsistent.
Es gibt andererseits gewisse syntaktische Übereinstimmungen in der
Benutzung von Vektoren und Zeigern, die einen irreführen können.
Na, das hast Du jetzt ja hinter Dir. ;-)