wie kann ich mit strcpy sicher
Will ich weisen Sie eine char*
zu char*
, wenn ich strcpy
bekomme ich mehrere run-time-Speicher problem also ich habe fix it durch einfache Zuordnung mit = operator
.
Kann irgend jemand erklären, was vorbereiten sollten, bevor Sie mit strcpy
zur Vermeidung von Speicherproblemen.
EDIT:
int Function(const char* K,char* FileIN,char* FileOut,int DC)
{
char *fic_in,*n_fic,*fic_out,*fic_dec;
unsigned char k[17];
fic_in = (char*)malloc(60*sizeof(char));
strcpy((char*)k,K);
//strcpy(fic_in,FileIN); //I remove this one
fic_in=FileIN; //and replace it by this
...
stackoverflow.com/questions/1258550/...
Wir vorübergehend nicht in der Lage, Ihre Meinung zu Lesen aufgrund technischer Schwierigkeiten. Zeigen Sie den code, bitte.
Sind Sie reservieren den nötigen Raum, die zuvor im Ziel-char*? Accoding zu verweisen (cplusplus.com/reference/clibrary/cstring/strcpy): "um Zu vermeiden, überläufe, die Größe des Arrays zeigte Ziel wird sein, lange genug, um enthalten die gleichen C-string als Quelle (einschließlich des abschließenden null-Zeichens), und sollten sich nicht überschneiden im Speicher mit der Quelle."
wahr. btw, ich habe nie gesagt, "strncpy", weder würde ich raten, es zu benutzen. Es ist sehr unsicher 😉
Nur für den Fall, Sie haben, Beispiel für einen "sicheren" Weg, um
Wir vorübergehend nicht in der Lage, Ihre Meinung zu Lesen aufgrund technischer Schwierigkeiten. Zeigen Sie den code, bitte.
Sind Sie reservieren den nötigen Raum, die zuvor im Ziel-char*? Accoding zu verweisen (cplusplus.com/reference/clibrary/cstring/strcpy): "um Zu vermeiden, überläufe, die Größe des Arrays zeigte Ziel wird sein, lange genug, um enthalten die gleichen C-string als Quelle (einschließlich des abschließenden null-Zeichens), und sollten sich nicht überschneiden im Speicher mit der Quelle."
wahr. btw, ich habe nie gesagt, "strncpy", weder würde ich raten, es zu benutzen. Es ist sehr unsicher 😉
Nur für den Fall, Sie haben, Beispiel für einen "sicheren" Weg, um
strncpy
: buf[len-1] = 0; strncpy(buf, src, len); if (buf[len] != 0) report_error;
. Ist Sie potenziell effizienter als die gleiche Sache mit strlen
zu prüfen, die Länge, gefolgt von memcpy
, aber dann wieder, es ist auch möglicherweise weniger effizient, vor allem, wenn src
ist deutlich kürzer als len
. Mit strlcpy
es wäre if (strlcpy(dst, src, len) >= len) report_error;
, die beginnt, schaut mich an, wie die Funktion "sicher ist" und nicht als "sicher verwendet werden können".InformationsquelleAutor Oumaya | 2012-10-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
a
ist ein Zeiger verweist auf einen string-literal.b
ist ein Zeiger, der nicht überall in allem (es ist nicht initialisierten).b
verweist nun auf den gleichen Speicher, diea
Punkte zu.c
ist jetzt ein array von 100 Zeichen. Das Gebiet der Speicher ist komplett getrennt von allem anderen so weit.Den Inhalt
c
(um genau zu sein, werden die ersten 15 Byte) halten Sie nun die gleichen Werte wie der Speicher verweista
. So, jetzt gibt es zwei Regionen des Speichers, der dieselbe Zeichenfolge enthalten Daten.So wie Sie sehen können, ist die Zuweisung von Zeigern hat so ziemlich nichts gemein mit
strcpy
. Wenn Sie möchten, weisen Sie einechar*
zu einemchar*
, dann sollten Sie nicht irgendwo in der Nähestrcpy
.Es ist wichtig, dass Sie Lesen ein Buch über C++, aber die Grundvoraussetzung für
strcpy
ist, dass die Ziel-pointer muss auf eine region der Speicher mit genügend Speicherplatz für die Zeichenfolge, die die Quell-Zeiger. Wahrscheinlich ist dein "run-time-Speicher-Probleme" wurden, weil Sie nicht gewährleisten, das ist, warum Sie benötigen, um ein Buch zu Lesen.es ist nicht möglich zu sagen, was genau das problem ist in der limited code, den Sie gezeigt haben. Aber die Antwort ist, was ich am Ende sagen, Sie haben zu erhalten genug Raum, von irgendwo. Es gibt mehr als einen Weg, das zu tun.
ja, mein Punkt ist der Aufruf dieser Funktion für jede Datei in einem Verzeichnis Baum rekursiv für seinen Unterverzeichnissen, so dass ich denke, und wie Sie schon erwähnten, es geht um einen gültigen Zeiger und genug Platz im Speicher 🙂
InformationsquelleAutor Steve Jessop
Kurze Antwort: sollten Sie nicht verwenden
strcpy
überhaupt, sondernstrncpy
. Die letztere Funktion wird nicht verlassen Sie sich auf ein abschließendes\0
und erfordert, dass Sie eine maximale Länge für das kopieren.Darüber hinaus für pointer-Zuweisung, die Sie nicht unbedingt brauchen
strncpy
überhaupt. Wollen Sie kopieren den Speicher oder weisen Sie einfach den Zeiger? Für die Umwidmung, die=
Betreiber ist völlig in Ordnung.Ja, ich war gerade dabei, dies zu klären.
Ich bin völlig auf +1, aber @Gnosophilon, an welchem Punkt ist ein strncpy unneccessarily benötigt, wenn man einfach die Zuweisung eines char* auf einen char*? =) In meiner Welt, nie =)
InformationsquelleAutor Gnosophilon
char*
ist ein Zeiger auf das Zeichen der Zeichenfolge. Eine Kopie zu machen, müssen Sie zuerst Speicher reservieren für Sie und führen Sie die Kopie. So etwas wie(und einige Fehler zu überprüfen ob malloc gelungen, etc).
Aber, unter Berücksichtigung auf Ihre Frage tagged
c++
ist, würde ich empfehlen, dass Sie einestd::string
Klasse und einige Bücher zu Lesen mittlerweile. Es hilft wirklich zu verstehen, wie die Dinge wirklich funktionieren.InformationsquelleAutor Michael Krelin - hacker
Müssen Sie sicherstellen, dass der Puffer ist groß genug, um die Quell-Zeichenfolge, einschließlich des abschließenden
'\0'
-Zeichen am Ende. Das ist es wirklich.Wenn Sie können strings als nur
char *
Hinweise, die Sie kopieren können, dann ist das toll, aber es ist nicht immer möglich.InformationsquelleAutor unwind