String allokieren??



  • BorisDieKlinge schrieb:

    Hallo ihr,

    was ist der Unterschied zwischen:

    char x= "Hallo";
    

    und

    char x[6]= "Hallo";
    

    ???

    Das erste ist falsch. Wobei du am wahrscheinlichsten char *x = "Hallo"; meinst. In diesem Fall zeigt x auf ein String Literal. Das ist ein konstanter String im Speicher, dessen Inhalt nicht verändert werden kann.

    Beim Zweiten initialisierst du das char Array mit den Werten { 'H', 'a', 'l', 'l', 'o', '\0'}. Du kannst den Inhalt des Arrays jederzeit ändern.



  • ja meinte char *x=... natürlich!

    danke:)



  • ganz einfach, bei der ersten version *char x= ... wird ein pointer (kein array) angelegt und initialisiert, bei der anderen char x[] = ... wird ein array (kein pointer) angelegt und ebenfalls initialisiert.
    🙂



  • aber es muss ja auch 6 byte allokiert werden aufm speicher bei der ersten Variante



  • BorisDieKlinge schrieb:

    aber es muss ja auch 6 byte allokiert werden aufm speicher bei der ersten Variante

    Ja, aber statisch.



  • BorisDieKlinge schrieb:

    aber es muss ja auch 6 byte allokiert werden aufm speicher bei der ersten Variante

    die erste variante verbraucht sizeof(char)* R/W speicher und strlen("Hallo")+1 read-only speicher (wobei der string "Hallo" auch wiederverwendet werden kann, d.h. wenn es ihn vorher schon gibt, muss kein zweiter angelegt werden).
    🙂



  • man lernt nie aus... ! d.h. dynamische und statische Allokationen werden aber aufm gleichen speicher abgelegt, wobei es im chaos Prinzip stattfinden, d.h. es gibts keinen extra statischen und dynamischen bereich aufm Speicher (RAM) nehm ich an! Sorry wenn ich so blöd frage...



  • BorisDieKlinge schrieb:

    man lernt nie aus... ! d.h. dynamische und statische Allokationen werden aber aufm gleichen speicher abgelegt, wobei es im chaos Prinzip stattfinden, d.h. es gibts keinen extra statischen und dynamischen bereich aufm Speicher (RAM) nehm ich an! Sorry wenn ich so blöd frage...

    Ich seh da keine dynamische Allokation, Du?

    Das Array landet auf dem Stack der Funktion, der Zeiger auch, aber das "Gezeigte" (der String) liegt im Zeigerfalle irgendwo in einem (möglicherweise ReadOnly-)Datenbereich.



  • Der Speicher wird schon sauber unterteilt in statischen Bereich (für globale Variablen, static Variablen, String-Literale), Stack (für "normale" Variablen und Funktionsparameter) und Heap (für alles, was du per malloc() bzw. new anforderst) - und jede Variable landet in "ihrem" Bereich.



  • BorisDieKlinge schrieb:

    man lernt nie aus... ! d.h. dynamische und statische Allokationen werden aber aufm gleichen speicher abgelegt, wobei es im chaos Prinzip stattfinden, d.h. es gibts keinen extra statischen und dynamischen bereich aufm Speicher (RAM) nehm ich an! Sorry wenn ich so blöd frage...

    doch. Die statische Sachen werden auf dem Stack angelegt. Dynamischer Speicher (Speicher angefordert durch malloc & Co.) wird vom Heap entnommen.

    edit: 😡 zu spät, dumme Wiki Links kosten Haufen Zeit



  • LordJaxom schrieb:

    Ich seh da keine dynamische Allokation, Du?

    die allokation von stackvariablen könnte man schon als dynamisch bezeichnen 😉

    CStoll schrieb:

    Der Speicher wird schon sauber unterteilt in statischen Bereich (für globale Variablen, static Variablen, String-Literale), Stack (für "normale" Variablen und Funktionsparameter)...

    string-literale sind konstanten und befinden sich normalerweise nicht im selben segment, in dem sich statische und globale variablen befinden.
    ...und funktionsparameter müssen nicht zwangsläufig über den stack wandern.
    🙂

    boris, du enttäuscht mich. als professioneller windows-entwickler scheinen dir fundamentale grundlagen zu fehlen 😞



  • tja bei manchen sachen ging ich nie so ins detail.. hab halt drauflos programmiert;)

    Naja ist schon komisch, oft hört man hier , man soll nicht im detail anfangen, also bspw. std::string verwenden ohne zu wissen was dahinter steckt! und wenn man übers detail mal ne nichts bescheid weis, wird man auch angemekkert.. tzzz 😃

    P.S: mit dynamisch meinte ich oben , das man bei char x[n]= "..." den inhalt ändern kann, iund bei cjhar *x="..."; nicht...



  • BorisDieKlinge schrieb:

    Naja ist schon komisch, oft hört man hier , man soll nicht im detail anfangen, also bspw. std::string verwenden ohne zu wissen was dahinter steckt! und wenn man übers detail mal ne nichts bescheid weis, wird man auch angemekkert.. tzzz 😃

    ist ja nicht böse gemeint. 🙂
    irgendwas zu verwenden, ohne zu wissen was dahintersteckt ist eigentlich nie zu empfehlen. man muss sich ja nicht jeden kleinkram merken, aber sowas wie arrays und pointer sind elementar und die unterschiede sollte man kennen.

    BorisDieKlinge schrieb:

    P.S: mit dynamisch meinte ich oben , das man bei char x[n]= "..." den inhalt ändern kann, iund bei cjhar *x="..."; nicht...

    man kann stringkonstanten nicht ändern, aber ein char* kann natürlich auch auf ein normales array zeigen, dessen elemente veränderbar sind. beispiel:

    char array[] = "hello"; 
    char *p = array;  // pointer, über den man das array verändern kann.
    

    🙂



  • jo das meinte ich:) thx


Anmelden zum Antworten