![]() |
![]() |
|
![]() |
![]() |
|
Programmierung Rat & Tat für Programmierer |
![]() |
|
Themen-Optionen | Ansicht |
![]() |
#11 | ||||
Hero
![]() Registriert seit: 04.09.2001
Beiträge: 894
|
![]() hi !
die von dir erwähnten sachen sind keine eigenarten von C gegenüber C++. Im Gegensatz zu C hat C++ Klassen, die gewisse Funktionalität kapseln - z.B. eine Stringklasse mit überladenem "+" und "=" Operator - deshalb ist da eine einfache Zuweisung von strings möglich. Intern führt die Klasse dann eine Speicheralokierung durch. (beim destruktor der klasse wird der spiecher wieder freigegeben). die Zuweisung zum char* funktioniert natürlich - du brachst dazu keine "strcpy"-Funktion. Es wird allerdings nicht der string zugewiesen (d.h. kopiert), sondern die Speicheradresse, an der die Zeichenkette gespeichert ist. Dieser Speicher ist in deinem Fall am Stack, da er lokal angelegt wird, da in einer Funktion vereinbart. Nach der verlassen der Funktion wird der Speicher freigegeben, du hast jedoch noch einen Zeiger, der darauf verweist. Beim nächsten Zugriff darauf hättest du unter Windows eine memory-exception. Was der TI macht, weiß ich nicht - ist aber sicher nicht die feine art. Zitat:
wenn du eine zeichenkette speicher willst, musst du auf jeden fall "char erg[15]" schreiben - wenn die zeichenkette nicht länger als 14 (!) Zeichen ist (+ ASCII Null). vorteil von maloc ist, dass du dynamisch zur laufzeit die größe des alokierten Speichers bestimmen kannst. Zitat:
Zitat:
was sind "kleine daten" ? Zitat:
![]() fg -hannes |
||||
![]() |
![]() |
![]() |
#12 | ||
Inventar
![]() |
![]() Danke für deine Antwort. War mal interessant zu wissen was sich eigentlich hinter dem einfachen = in C++ bei Strings verbirgt.
Zitat:
Zitat:
Viele Grüße, Harri |
||
![]() |
![]() |
![]() |
#13 |
Inventar
![]() Registriert seit: 24.01.2001
Beiträge: 5.631
|
![]() PHP-Code:
char *erg1; ist eine Adressvariable char erg2[20]; ist ein Characterfeld mit 19+1 (Nullterminierter Sring) oder 20 Elementen. erg1 ... nimmt Adressen durch eine Zuweisung - also durch den '=' Operator - an. erg2 ... ist ein Label (Anfangsadresse eines Arrays = Feld = eindimensionale Matrix). erg2="..."; geht nicht, da erg2 kein L-Wert ist. erg2 kann nicht neu gesetzt werden, da es (=eben das gegenständliche Label) auf eine unveränderliche Speicherplatzposition zeigt. Ein L-Wert ist eine Variable oder ein Zeiger ... mfg Kikakater |
![]() |
![]() |
![]() |
#14 | |
Hero
![]() |
![]() Wobei aus logischen Gründen diese Zeile
Zitat:
Allerdings ist dieser Code problematisch. Nach dem Verlassen der Funktion char * stab(double hm) gibt es keine Garantie mehr, dass die Speicheradressen, die vorher "stabil", "indifferent" oder "labil" als Inhalt hatten, dies noch tun werden. Sobald eine Funktion verlassen wird, kann im Rechner der von der Funktion belegte Speicher wieder freigegeben werden. Es ist nämlich möglich, dass der RAM-Speicher vorübergehend auf die Festplatte ausgelagert wird (virtueller Speicher). Daher sollte tunlichst der Speicher explizit über malloc oder ein statisches Array reserviert werden. (static oder eben eine globale Variable). Dann ist aber ein strcpy erforderlich.
____________________________________
Bibel |
|
![]() |
![]() |
![]() |
#15 | ||
Inventar
![]() Registriert seit: 24.01.2001
Beiträge: 5.631
|
![]() Zitat:
Das ist Gewohnheit und bleibt schön im Programmcode. Wenn nicht alle logischen Fälle abgedeckt werden, wird auf den String "Fehler" verwiesen. Das ist nicht nur recht und billig, sondern programmatisch notwendig. Eine Redundanz hier in diesem Fall zu eleminieren ist strategisch nicht zu vertreten. Zitat:
Diese Art von Initialisierung wandert somit auf den Heap (deutsch Halde) und ist per definitionem als statisch zu bezeichnen. Ich kann hier leider nicht mit Gefühlsbeschwichtigungen dienen, dies sind die Tatsachen, Gegenbeweise noch ausstehend. |
||
![]() |
![]() |
![]() |
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
|
|