Frage

Ich habe versucht, die strcpy C Funktion neu zu erfinden, aber wenn ich versuche, es zu laufen bekomme ich diesen Fehler:

Unhandled exception at 0x00411506 in brainf%ck.exe: 0xC0000005: Access violation writing location 0x00415760.

Der Fehler tritt in der *dest = *src; Linie. Hier ist der Code:

char* strcpy(char* dest, const char* src) {
    char* dest2 = dest;
    while (*src) {
        *dest = *src;
        src++;
        dest++;
    }
    *dest = '\0';
    return dest2;
}

EDIT: Wow, das ging schnell. Hier ist die Telefonvorwahl (strcpy in mystring.c definiert):

#include "mystring.h"
#include <stdio.h>

int main() {
    char* s = "hello";
    char* t = "abc";
    printf("%s", strcpy(s, t));
    getchar();
    return 0;
}
War es hilfreich?

Lösung

char* s = "hello";
char* t = "abc";
printf("%s", strcpy(s, t));

Der Compiler Ihre Zielpuffer, s, im schreibgeschützten Speicher abgelegt, da es eine Konstante ist.

char s[5];
char* t = "abc";
printf("%s", strcpy(s, t));

Sollte dieses Problem beheben. Dies ordnet den Ziel-Array auf dem Stapel, die beschreibbar ist.

Andere Tipps

Das offensichtliche potenzielle Problem ist, dass Ihr Ausgangspuffer nicht genügend Speicher zugewiesen hat, oder Sie haben in NULL für dest geben. (Wahrscheinlich nicht für src oder es würde, bevor sie auf der Linie versagt haben.)

Bitte geben Sie ein kurzes, aber vollständige Programm, das Problem zu reproduzieren, und wir können überprüfen, ...

Hier ist ein Beispiel, den Knall für mich unter Windows geht:

#include <stdlib.h>

char* strcpy(char* dest, const char* src) {
    char* dest2 = dest;
    while (*src) {
        *dest = *src;
        src++;
        dest++;
    }
    *dest = '\0';
    return dest2;
}

void main() {
    char *d = malloc(3);
    strcpy(d, "hello there this is a longish string");
}

Beachten Sie, dass ich in diesem Fall hatte die tatsächlichen zugewiesenen Speicher durch einen angemessenen Betrag zu überschreiten, bevor ich das Programm provozieren könnte, um zu sterben - nur „Hallo“ Absturz nicht, obwohl es sicherlich zu verschiedenen Aspekten des Compilers abhängig könnte und Ausführungsumgebung.

Ihre strcpy () ist in Ordnung. Sie schreiben auf Read-Only Memory. Sehen Sie diese Beschreibung hier .

Wenn Sie dies geschrieben hatte, würden Sie in Ordnung sein:

#include "mystring.h"
#include <stdio.h>

int main() {
    char s[] = "hello";
    char t[] = "abc";
    printf("%s", strcpy(s, t));
    getchar();
    return 0;
}

Es gibt ein Problem mit in der Hauptroutine des neu erfunden strcpy Routine aufrufen, sowohl Zeichenfeld:     char * s = "Hallo";     char * t = "abc"; wird in den Speicher landen nur Segment bei der Kompilierung lesen. Wie Sie versuchen, den Speicher durch s in der Routine strcpy darauf zu schreiben, und da es in einem READ ONLY-Segment zu einem Speicherort, wird er gefangen, und du wirst eine Exception. Diese Strings werden NUR LESEN!

Stellen Sie sicher, dest hat ist es Speicher zugewiesen wird, bevor diese Funktion aufgerufen wird.

Wahrscheinlich ein Problem mit dem Anrufer: Haben Sie die dest Zeiger? Ist es etwas gültig oder nur Müll zeigen? Abgesehen davon, ist das Mindeste, was Sie tun könnten für Null-Zeiger zu überprüfen, wie if (! Dest ||! Source) {/ * etwas tun, wie NULL zurückgeben oder eine Ausnahme auslösen * /} auf Funktion Eintrag. Der Code sieht nicht gut aus. Nicht sehr sicher, aber OK.

Es gibt mehrere Fehler.

  1. Sie keinen Rückgabepuffer zuweisen, die die kopierte Zeichenfolge halten kann.
  2. Sie nicht überprüfen, um zu sehen, ob src vor der Verwendung * src
  3. null ist
  4. Sie Tring sowohl die Antwort in einem Parameter zu erhalten und den Wert zurück. Führen Sie einen oder der anderen Seite.
  5. Sie können den Puffer dest leicht überrannt.

Viel Glück.

, wann immer der Code Starten der Ausführung (generaly beginnt es von der Hauptfunktion). bedeutet hier die Codesequenz von execution.so, wenn der Prozess (Abfolge der Ausführung) beginnt, wird der PCB (Prozesssteuerblock) erstellt, die Leiterplatte komplett infromation über den Prozess wie Prozessadressraum, kernal Stapel, OFDT Tabelle wie folgt mit .

im Code

  

char * s = "Hallo";
      char * t = "abc";

Das ist das, was Sie Eingänge von zwei Strings wie folgt genommen haben.

hier, die die Saiten (die doppelten Anführungszeichen Mittel), die in Textteil des Prozessadressraum vorhanden sind. hier Textabschnitt ist derjenige, der Abschnitt, der nur in dem Prozessadressraum und Textabschnitt vorhanden ist, die Berechtigungen für schreibgeschützt ist. das ist, warum, wenn Sie versuchen, die Quelle Zeichenfolge / Ziel-String zu ändern, wir dürfen nicht vorhanden die unabhängig von Daten ist in dem Text setion ändern gewährbar. so ist es das, was der Grund für Ihren Code, den Sie müssen vorsichtig sein. Ich hoffe du verstehst.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top