PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C-Frage


07.07.2007
2011-11-02, 13:08:47
Hallo,

folgendes Beispiel erzeugt eine Access Violation unter Linux und Windows

int main(char* argv, int argc)
{
char* myText = "";
sprintf(myText, "Hello World");

printf("%s", myText);
return 0;
}

Was mache ich hier falsch? Sorry bin blutiger Anfaenger.

Exxtreme
2011-11-02, 13:14:31
Mach mal anstatt:

char* myText = "";

lieber:

char myText[12];

oder:

char* myText = "Hello World";

Dann sollte es klappen.

Hintergrund:

Mit "char* myText = """ wird nur ein einzelnes char-Zeichen reserviert. Wenn du versuchst 11 Zeichen reinzukopieren dann schmeisst das Betriebssystem eine Schutzverletzung weil du in Bereiche reinschreibst, die nicht dafür reserviert sind.

schleiftier
2011-11-02, 13:41:06
Die Erklärung stimmt so nicht.

Mit char* myText = ""; legst du einen Zeiger an, der auf einen String in deinem Binary zeigt. Genauer, auf einen String im Text-Segment. Dieses Segment ist read-only, daher die Access Violation. Die Länge des bei der Initialisierung in myText abgelegten Strings ist dabei egal.

Gast
2011-11-02, 16:58:16
Die Terminierung des Strings wäre auch noch zu beachten.

del_4901
2011-11-02, 19:18:42
char myText[12];

Ist Ok, da auf dem Stack alloziert

char* myText = "Hello World";

Ist nicht Ok, letzteres ist naemlich ein "Literal" und wird direkt mit in das Codesegment gepackt

Alternativ kann man den String auch mit (new/delete) auf dem Heap allozieren.

Gast
2011-11-02, 19:55:34
Die Methodensignatur stimmt auch nicht.
Es ist



int main(int argc, char **argv) { }

Gast II
2011-11-04, 13:23:12
Ist Ok, da auf dem Stack alloziert
...
Alternativ kann man den String auch mit (new/delete) auf dem Heap allozieren.
Nicht in C.
Hier gibt es malloc & Freunde / free