ich nix kapische c: Problem bei String-Kopie
-
Ich habe folgenden (vereinfachten) code:
char* funcStack[10]; int main() { unsigned short funcIndex = 0; char* string = "aaaa"; strcpy(funcStack[funcIndex], string); return 0; }
Der code kompiliert wunderbar und er führt auch aus, nur habe ich mich gewundert, warum ich nie etwas danach ausgeben konnte. Beim debuggen wird es klarer: Beim strcpy gibt es eine "Zugriffsverletzung beim Schreiben" als "unbehandelte Ausnahme".
Ich habe vermutet, dass es vielleicht ein Fehler mit dem nur deklarierten aber nicht initialisierten Array funcStack sein könnte (obwohl doch globale Variable alle initialisiert werden und somit alle Elemente eine gültige Adresse bekommen müssten ?!). Daher habe ich einfach über eine Schleife die Elemente des Arrays mit einem String vorbelegt, dennoch kommt der gleiche Fehler.
Was übersehe ich?!
-
s.u.
-
Wie wär's wenn du für jedes funcStack[0..9] zuerst mal Speicher reservierst?
#include <stdlib.h> #include <string.h> char *funcStack[10]; int main() { for( int i = 0; i < 10; ++i ) funcStack[ i ] = ( char* ) malloc( 10 ); unsigned short funcIndex = 0; char string[ ] = "aaaa"; strcpy(funcStack[funcIndex], string); // und auch wieder freigiebst... for( int i = 0; i < 10; ++i ) free( funcStack[ i ] ); }
Greetz, Swordfish
-
Du hast ein Zeigerfeld auf von 10 Zeigern des Types char diese sind uninitialisiert und zeigen auf was das nur Gott oder der Zufall kennt im endlichen Speicher.
Deshalb die Zugriffsverletzung!
schau Dir bitte mal alles an was zu Zeigern in Deinem Buch oder dem Tutorial
zu Zeigern steht.wenn Du also sowas machst
/* hast Du ein Zeigerfeld von 10 Zeigern die alle Addressen von Zeichenketten aufnehmen koennen diese sind wenn es bei dieser Deklaration bleibt nicht initialisiert */ char * woerter[10];
Gruss sclearscreen
-
machst Du oder versucht Du nun weiter mit strcpy was auf diese Addressen (10 Zeichenkettenzeiger) zu kopieren ueberschreibst Du also Daten von anderen
Dingen im Speicher ---> == Zugriffsverletzung
-
Danke für die Antworten und die Erklärungen. Auch, wenn jetzt de richtige Weg klar ist, so bleibt für mich eine Frage. Wie ich selbst geschrieben habe, habe ich schon vermutet, dass die Arrayelemente noch keine gültige Speicheradresse zugewiesen bekommen haben.
Folgendes funktioniert ja ohne weiteres:
int* strings[10]; void main() { strings[0] = "a"; printf("%s", strings[0]); }
Hier wird anscheinend bei der Zuweisung gleich ein gültiger Speicherplatz zugewiesen. Daher habe ich als Notlösung versucht, über eine Schleife alle Zellen des Arrays mit einem default-Wert zu belegen und dann in die initialisierten Zellen den eigentlich String zu kopieren.
Funktioniert das bei mir vielleicht nicht, weil die Breite der vorinitialisierten Zelle bereits >= des zu kopierenden Strings sein muß?
-
Wieso wehrst du dich eigentlich dagegen, dir Speicher zu holen?
Wenn du
int main() { char text[] = "Some Text"; }
machst, wird "Some Text" in der data Section deines Programms abgelegt und test zeigt darauf. Jeder string den du (nach der Initialisierung mit "Some Text" ) da reinschreibst, muss natürlich <= strlen( "Some Text" ) sein, da du sonst die darauffolgenden Bytes überschreibst -> General Protection Fault.
Greetz, Swordfish
-
Welchen Speicher Du bei uninitialisierten Speicher erwischt ist purer Zufall
Du kannst Glück haben und es geht.
Du kannst aber auch Pech haben und erwischts Speicher der einem Prozess gehört.Das ist auch völlig unabhängig davon ob int, char, float, double....
davor steht.*<Datentype/Selbstdefinierter Datentyp> <Zeigerfeldname>[Anzahl Zeiger];
Machst Du auf obiger Basis eine Deklaration und nix besonderes weiter hast
Du immer N Zeiger die Russisch Roulette spielen sofern Du die Nicht initilisierts.Du weist in Deinem letzten Post dem Zeiger mit dem Index 0 einfach irgenwas zu
und überschreibst sagen wir vielleicht damit Daten von Deinem
gerade laufenden Spiel "Call of Duty". Vielleicht ist es aber auch ungenutzter Speicher dann meckert das Betriebssystem selsbtverständlich nicht.
-
So, nun hab ichs. Danke für die Nachhilfe, wie ihr merkt bin ich ziemlich aus der Übung mit C und dem zusammengehörigen Speichermanagement