Strcpy Segmentation Fault C
Ich Lerne einige neue Dinge stecken, die auf ein einfaches strcpy Betrieb.
Ich verstehe nicht, warum zum ersten mal, wenn ich drucken funktioniert, aber zweites mal nicht.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
char *name;
char *altname;
name=(char *)malloc(60*sizeof(char));
name="Hello World!";
altname=name;
printf("%s \n", altname);
altname=NULL;
strcpy(altname,name);
printf("%s \n", altname);
return 1;
}
- Sie sind nicht die Zuweisung von mehr Speicher für altname/name.
- wow, das ist ineffizient.
sizeof(char)
ist garantiert 1 byte, und wenn Sie gehen, um zu reservieren eine Feste Speichergröße, warummalloc()
?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie Speicher für
altname
:Fangen die Probleme hier:
Sie ersetzt den Wert, der zurückgegeben wird, durch
malloc
mit einem string-literal.Du Speicherleck (da kann man nicht wieder die Zeiger Rückgabewert
malloc
). Alle Anrufe zumalloc
sind abgestimmt mit einem entsprechenden Aufruffree
. Da Zeiger mit dem Wert Weg ist, die Gelegenheit zu nennenfree
mit diesem Zeiger Wert ist auch verschwunden.Sie weiter schreiben Sie einen NULL-Zeiger, was zu undefiniertem Verhalten (was in deinem Fall produziert einen Speicherzugriffsfehler).
Ersten mal, Sie machen
altname
Punkt an der gleichen Stelle wiename
. Das ist OK, weilname
Punkte, um eine gültigechar*
(das erste element des"Hello World!"
literal)Zweiten mal, Sie versuchen, kopieren Sie die Daten wies auf die von
name
in den Ort zeigte auf, indemaltname
, die in dieser Phase Punkte zu NULL. So dass Sie versuchen, zu schreiben, zu NULL, was ist die Quelle der Fehler.strncpy
erfordert, dass die Ziel-Puffer beschreibbar sein, und groß genug, um kopieren Sie die Quell-Zeichenfolge-Daten in. Sie brauchen, umaltname
Punkt auf einen Puffer, der groß genug ist für den Inhalt der Zeichenfolgename
Punkte zu.Beachten Sie auch, dass wenn Sie
name = "Hello World!"
Sie Leck Sie den Speicher, den er ursprünglich hinwies. Sie müssen frei, die erste:Sie versuchen, einen Wert zuweisen zu
altname
hat keine Speicherplatz zum speichern. Ersten Speicher zualtname
weisen