Speicherzugriffsfehler
-
char* t= "Hallo";
ist nichts anders als
const char* t= "Hallo";
du kannst den Inhalt der Daten nicht ändern, auf die t zeigt. Wenn du aber es trotzdem willst, musst du so machen:
char t[] = "Hallo"; ...
oder so
char* t; t = malloc(6); strcpy(t, "Hallo"); t[2]='c'; free(t);
-
Was ist der Unterschied zwischen
char* t= "Hallo";
und
char t[] = "Hallo";
-
cc -Wall schrieb:
Was ist der Unterschied zwischen
char* t= "Hallo";
Hier wird ein Zeiger definiert, der auf einen konstanten Speicherbereich zeigt.
und
char t[] = "Hallo";
Hier wird ein Array definiert, für das Speicher reserviert wird in der Größe von 6 Byte (Hallo + Stringendezeichen) und zusätzlich der reservierte Speicher mit dem Initialisierungsstring gefüllt wird.
-
cc -Wall schrieb:
Was ist der Unterschied zwischen
char* t= "Hallo";
und
char t[] = "Hallo";
wie gesagt, char* t = "Hallo"; ist konstanter Speicher. Ein zeiger ist eine Variable, die eine Adresse speichert. Der Ausdruck "hallo" wird konstant im Speicher generiert und an t zugewiesen, deshalb zeigt t auf "hallo", aber der Speicher ist wie gesagt konstant und darf nicht geändert werden.
außerdem ist char* ein Zeiger, also eine Variable, die auf eine andere zeigt bzw. eine Adresse speichert. char[] ein Array (Feld), also eine Variable von typ char, das mehrere Elemente von typ char enthält. Das sind 2 komplett unterschiedliche Datentypen. (Zeiger!=Array)
-
Danke für eure Antworten, ich kapiers jetzt
Allerdings hätte ich noch eine Frage:
char* t = "Hallo";
Die Zeichenkette ist also in einem read-only Speicherbereich angelegt.
In welchem Segment ist das aber nun genau?
Datensegement?
-
ich schätze mal heap?
-
egal schrieb:
Die Zeichenkette ist also in einem read-only Speicherbereich angelegt.
glaub auch nicht, dass es wirklich im "read-only" bereich landet. der sollte eigentlich nur für das betriebssys. reserviert sein! es wird einfach const deklariert... -> was das mit dem "read-only" ja nicht impliziert
hth,
ciao
-
hephaistos6 schrieb:
egal schrieb:
Die Zeichenkette ist also in einem read-only Speicherbereich angelegt.
glaub auch nicht, dass es wirklich im "read-only" bereich landet. der sollte eigentlich nur für das betriebssys. reserviert sein! es wird einfach const deklariert... -> was das mit dem "read-only" ja nicht impliziert
hth,
ciaodoch doch.. man kann nicht mehr darauf schreiben --> read-only
mfg (c)h
-
meiner meinung nach kann mit const deklarierte konstanten immernoch aendern, d.h. stehen sie nicht in einem "read only" bereich, da man sie ja aendern kann. nur mit
#define
deklarierte konstanten sind konstant, aber keine ahnung, ob sie in einem read-omly bereich stehen!
-
asddfgh schrieb:
meiner meinung nach kann mit const deklarierte konstanten immernoch aendern, d.h. stehen sie nicht in einem "read only" bereich, da man sie ja aendern kann. nur mit
#define
deklarierte konstanten sind konstant, aber keine ahnung, ob sie in einem read-omly bereich stehen!
SIE SIND READ-ONLY!
mit defines wird ja nur der Präprozessor beeinflusst und das sind KEINE VARIABLEN! sie stehen nicht im (sagen wir mal) "variablenspeicherbereich" sondern im "Programmspeicherbereich"
Unterschied:
const= constante variable
define= keine variable - wird direkt im quellcode eingesetzt.mfg (c)h
-
asddfgh schrieb:
meiner meinung nach kann mit const deklarierte konstanten immernoch aendern, d.h. stehen sie nicht in einem "read only" bereich, da man sie ja aendern kann. nur mit
#define
deklarierte konstanten sind konstant, aber keine ahnung, ob sie in einem read-omly bereich stehen!
nein, komplett falsch. Eine Konstante heißt Konstante, weil sie konstant bleibt und sich nicht mehr ändern lässt. Dabei ist das schon nur read-only, d.h. du kannst druaf zugreifen, aber nicht ändern.
Die Konstanten, die man mit #define definiert, sind in Wirklichkeit keine Konstanten, nicht einmal eine Variable, sie sind Makros
#define COS 87
wenn der Compiler (außer innerhabl von " ") ersetzt alle COS durch 87 bevor es kompiliert wird. Wenn du sowas hast
COS = 2;
um den Wert von COS zu ändern, wirst du einen Compilerfehler erzeugen, denn in Wirklichkeit
87 = 2;
kompiliert wird. Also kann man die #defines ebenso wenig ändern, wie const Variablen, eigentlich weniger weil COS nicht im Speicher gespeichert wird.
-
@supertux: ^^ hatte ich doch auch schon erwähnt..