2 Stimmen

Segmentation fault beim Verwenden von strcpy?

Ich versuche, einen Pfad zur Compile-Zeit zu definieren, indem ich folgendes übergebe:

-DDCROOTDEF='"/Pfad/zum/Zeug"'

auf der Kompilierungszeile. Dann versuche ich, dies im Code zu verwenden, wie folgt:

char * ptr_path;  
strcpy(ptr_path, DCROOTDEF);
strcat(ptr_path,"/MainCommons/CommonLib/fonts/Arial.ttf");
char *pftf=ptr_path;
gdImageStringFT(pimg,brect,iclr,pftf,pts,ang,ixp,iyp, (char *)cbuf);

Was mir eine Segmentation Fault gibt. Wenn ich jedoch zuerst den String drucke:

char * ptr_path;
strcpy(ptr_path, DCROOTDEF);
strcat(ptr_path,"/MainCommons/CommonLib/fonts/Arial.ttf");
char *pftf=ptr_path;
printf("%s\n",pftf);
gdImageStringFT(pimg,brect,iclr,pftf,pts,ang,ixp,iyp, (char *)cbuf);

Funktioniert es einwandfrei. Welche Feinheiten von Zeiger auf Charaktere verpasse ich hier?

Danke

0 Stimmen

Wie wäre es, am Ende des Strings ein '\0' hinzuzufügen?

1 Stimmen

@karlphillip: Das \0 wird automatisch am Ende eines Zeichenkettenliterals hinzugefügt.

3voto

James McNellis Punkte 337231
char * ptr_path;
strcpy(ptr_path, DCROOTDEF);

Sie initialisieren ptr_path nie.

Es funktioniert nicht im zweiten Code-Schnipsel, Sie haben nur Pech und es scheint zu funktionieren. Sie verwenden immer noch einen nicht initialisierten Zeiger und versuchen, an einer unbekannten Stelle im Speicher zu schreiben.

Sie müssen ptr_path initialisieren, um auf ein Array von char zu zeigen, das mindestens die Länge von strlen(DCROOTDEF) + 1 hat. Sie müssen auch die Länge von DCROOTDEF überprüfen, bevor Sie seinen Inhalt in das Array kopieren, um sicherzustellen, dass es nicht zu lang ist. Sie können dies manuell mit strlen tun oder Sie können eine Längen-überprüfte Kopierfunktion wie strlcpy verwenden.

0 Stimmen

Strlcpy ist nicht standardmäßig, oder?

0 Stimmen

@Nyan: strlcpy ist nicht standardmäßig. Sie können leicht eine Implementierung online finden.

0 Stimmen

Wenn es zu funktionieren scheint, dann funktioniert es. Ein mögliches Ergebnis von undefiniertem Verhalten ist das Verhalten, nach dem Sie eigentlich gesucht haben. Leider.

1voto

unwind Punkte 377331

Der Zeiger ptr_path ist nicht initialisiert, um auf beschreibbaren Speicher zu zeigen, deshalb stürzt das Dereferenzieren mit strcpy() ab.

Sie müssen zuerst z.B. malloc() aufrufen, um den Speicherplatz zu erhalten:

char * ptr_path = malloc(PATH_MAX);

Oder so etwas in der Art.

0 Stimmen

Und du musst den Speicher auch mit free() freigeben, wenn du damit fertig bist.

1voto

sharptooth Punkte 162790

In

char * ptr_path;
strcpy(ptr_path, DCROOTDEF);
strcat(ptr_path,"/MainCommons/CommonLib/fonts/Arial.ttf");

Der Zeiger ist nicht an einen rechtlich zugewiesenen Speicherblock gebunden, daher läuft Ihr Programm in undefiniertes Verhalten. Sie müssen zuerst einen Puffer zuweisen - beispielsweise mit malloc(). Stellen Sie sicher, dass der Puffer groß genug ist, um den resultierenden String zusammen mit dem abschließenden Nullzeichen aufzunehmen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X