char* und sizeof()
-
Habe eine Variable
{ int size; char mychar[512+1]; size = sizeof(mychar); // Hier 513 myfunction(mychar); } void myfunction(char* c) { int size; size = sizeof(c); // Warum jetzt 4 bytes }
Wie muss ich es machen, dass ich in der Funktion sizeof aufrufen kann und mir das 513 zurückliefert?
-
An die Funktion wird ein Zeiger übergeben, der keine Information über die Länge des Arrays, sondern nur über die Position des ersten Elementes beinhaltet.
Benutz doch dafür strlen(), dazu müsstest du jedoch ein gültiges char-Array mit terminierendem \0 haben.
Wieso benötigst du überhaupt eine Funktion, wo du doch bereits sizeof() hast? Mach doch eine Funktion, wo du als zweiten Parameter sizeof(c) übergibst.
-
der sizeof Operator liefert nur den Speicherverbrauch, sprich sizeof(x) liefert wie viele Bytes x im Speicher verbraucht.
char mychar[512+1]; sizeof(mychar) == 513
weil 'mychar' ein char-Array mit 513 Stellen. Ein char benötigt 1 Byte --> sizeof(mychar) == 1*513.
myfunction(char* c) { sizeof(c) == sizeof(char*) }
In diesem Fall ist 'c' *kein* Array von Elementen sondern ein Zeiger. sizeof liefert die Anzahl von Bytes, die ein char Zeiger benötigt, und die ist 4 (bei x86 Rechnern).
Um die Länge eines Strings zu berechnen, verwendet man man: strlen(3)
-
char mychar[512+1]; sizeof(mychar) == 513;
Ist hier mychar kein char*?
Wenn doch,
dann müsste hier ja auch 4 Byte rauskommen.
---
Wenn nicht:
warum kann ich der Funktion die nicht char* Variable übergeben ohne das ich sie nach char* Caste? Oder macht er das Casten automatisch?
-
Zu deiner ersten Frage: Nein, mychar ist kein char* (= Zeiger auf einen char), sondern ein char[513] (= eindimensionales char-Array mit 513 Elementen). Du musst klar zwischen Zeigern und Arrays unterscheiden.
Zur zweiten: Es wird nichts gecastet, du übergibst im Prinzip nicht das Array selber, sondern eben diesen Zeiger. Deshalb schreibst du auch char* und nicht char[513] als Parameter. Und bei der Übergabe als Zeiger ist innerhalb der Funktion die Information über die Dimension des Arrays verloren.
-
Jetzt hab ichs verstanden.
In den C Büchern steht immer das Zeiger und Arrays kompatible sind.
Dachte es gebe überhaupt keinen Unterschied außer der Schreibweise.
-
Sisko86 schrieb:
Jetzt hab ichs verstanden.
In den C Büchern steht immer das Zeiger und Arrays kompatible sind.
Dachte es gebe überhaupt keinen Unterschied außer der Schreibweise.Leider sind viele Bücher hier teilweise nicht ganz korrekt und noch seltener exakt. Zum Thema Zeiger/Array kann ich die Sektion auf c-faq.com empfehlen. Am besten gleich die ganze Seite lesen. Ist kompakt, exakt und seeeehr lehrreich.
-
Sisko86 schrieb:
In den C Büchern steht immer das Zeiger und Arrays kompatible sind.
Arrays und Zeiger sind insofern kompatibel, dass ein Array implizit in einen Zeiger auf das erste Element umgewandelt werden kann. Und das macht der Compiler auch bei jeder sich ihm bietenden Gelegenheit, wie zB bei der Parameterübergabe von Funktionen, da C hier lediglich call-by-value Semantik kennt.
Folgendes
void myfunction(char* c) // und void myfunction(char c[])
ist übrigens semantisch identisch.
Für dein Vorhaben ist die einfachste Lösung, die Grösse des Arrays als zusätzlichen Parameter zu übergeben.
void myfunction(char* c, size_t n) //... myfunction(mychar, sizeof(mychar));