Datum:
Hallo, hätte eine kurze Frage zur Arbeitsweise des gcc, bzw auch anderen C Compilern. Folgendes kurzes Codesegment:
char string[6]; printf("%i", sizeof(string)); |
liefert natürlich Ausgabe 6. Aber woher weis die Software die Länge des Strings (oder eines Arrays)? Reiche ich den String an eine Funktion weiter
doSomething(string); |
mit dem Prototyp
void doSomething(char *); |
und lass mir dort die sizeof ausgeben, kommt irgendwas raus. Anhand des '/0' kann sizeof die Länge ja nicht ermitteln, da der komplette String ja normalerweise zu NULL initialisiert wird. Kann mich jemand aufklären? Viele Grüße, lex
Datum:
Die Software weiß das weil es der Compiler reingeschrieben hat, Zitat Wikipedia: "In most cases, sizeof is a compile-time operator, which means that during compilation sizeof expressions get replaced by constant result-values."
Datum:
Danke dir, erklärt natürlich einiges. Das macht es meiner Funktion (die einen String übergeben bekommt) aber unmöglich festzustellen, wieviel sie reinschreiben darf. Will ich sichergehen, dass der String leer ist kann ich ihn auch nicht einfach mit NULL füllen. Wie löst man sowas am geschicktesten? Zweiten Parameter für die Länge? Oder hoffen dass der Aufrufer genug Platz reserviert hat?
Datum:
lex schrieb: > char string[6]; Das Array hat die Größe 6 Byte. > doSomething(char *); Der Zeiger hat (iA) die Größe 2 Byte (da steht char*). Es sind unterschiedliche Datentypen.
Datum:
> Wie löst man sowas am geschicktesten? > Zweiten Parameter für die Länge? genau so! > Oder hoffen dass der Aufrufer genug Platz reserviert hat? auf keinen Fall, das ist ne riesen Sicherheitslücke.
Datum:
lex schrieb: > Zweiten Parameter für die Länge? Das ist ein gängiger Weg. Die Funktion muß die Länge auf irgendeine Weise kennen. Joachim Drechsel schrieb: > lex schrieb: >> char string[6]; > > Das Array hat die Größe 6 Byte. > >> doSomething(char *); > > Der Zeiger hat (iA) die Größe 2 Byte (da steht char*). Naja, 2 gibt's eigentlich haupstächlich auf ganz kleinen µCs und alten DOS-Rechnern. 4 und 8 sind heute doch deutlich häufiger anzutreffen. > Es sind unterschiedliche Datentypen. Und zwar auch dann, wenn man schreiben würde:
doSomething(char string[6]); |
Die Defintion des Parameters sieht zwar exakt gleich aus wie die Variable oben, aber trotzdem ist der Funktiosnparameter kein Array, sondern immer noch ein Zeiger auf char. Man kann an Funktionen keine Arrays direkt übergeben. Man übergibt nur einen Zeiger, und dem sieht man die Größe des Arrays nicht mehr an. Also muß diese Größe auf anderem Weg mitgeteilt werden.
Datum:
Rolf Magnus schrieb: > Naja, 2 gibt's eigentlich haupstächlich auf ganz kleinen µCs und alten > DOS-Rechnern. 4 und 8 sind heute doch deutlich häufiger anzutreffen. Achwas. Hier ist doch Mikrocontroller :-))))) (hast ja recht, ich wollte nur das Auge für den Unterschied schärfen)
Datum:
Könnte man auch sowas machen?
char* doSomthing() { static *str=NULL; // prüfen, ob str!=NULL -> Speicher freigeben // neuen Speicher anlegen; nach was für Regeln auch immer // String füllen return str; } // Programmteil char *strTmp,string[6]; strTmp=doSomthing(); strcpy(string,strTmp); // oder sogar bei völlig variablen Rückgabelängen char *strTmp,*string; strTmp=doSomthing(); // Speicher für 'string' anmelden mit Größe 'strlen(strTmp)+1' // danach: strcpy(string,strTmp); |
Datum:
Ralf G. schrieb: > char* doSomthing() > { > static *str=NULL; > // prüfen, ob str!=NULL -> Speicher freigeben > // neuen Speicher anlegen; nach was für Regeln auch immer > // String füllen > return str; > } static char *str; Die Funktion soll ja einen char-Pointer zurückgegeben.
Datum:
Joachim Drechsel schrieb: > static char *str; > > Die Funktion soll ja einen char-Pointer zurückgegeben. Ja, geträumt! :(