string kopieren --> access violation



  • Hi Leute,

    ab und an mal führt dieser Code hier zu einer Access Violation.

    // einen string kopieren
    char * copystring(char *pDest, const char *toCopy, int length)
    {
      for(int x = 0; x < length; x++)
      {
        pDest[x] = toCopy[x];
      }
      return pDest;
    }
    

    Ich könnt mir vorstellen, dass der über ein Array drüber schreibt.
    Aber sicher bin ich mir nicht, ob's daran liegt.

    Weiss jemand von euch, warum er dabei abstürzen könnte?
    Und wie könnt ich den Code umbauen, damit er absturzsicher ist?

    strcpy() oder strncpy() bringt mir nix.
    Denn der Code soll folgendes machen können:

    Beispiel:

    char test[20];
    char * hallo = "dies ist ein test";
    
    copystring(test, &hallo[3], 7);
    


  • Hallo,

    wahrscheinlich ist, dass pDest zu klein ist, um alle Daten von toCopy
    aufzunehmen.

    Und warum solltest du strncpy etc. nicht nutzen koennen? Angenommen du machst
    aus deiner Funktion folgende:

    char * copystring(char *pDest, const char *toCopy, int length) 
    { 
       return strncpy(pDest,toCopy,length); 
    }
    

    dann funktioniert

    char test[20]; 
    char * hallo = "dies ist ein test";
    
     copystring(test,&hallo[3],7);
    

    auch. Denn toCopy zeigt jetzt auf das vierte Element und ab diesem werden
    die naechsten 7 Zeichen nach test kopiert.

    mfg
    v R



  • Was stoert dich an strncpy?

    Abstuerzen kann copystring sehr leicht: wenn pDest weniger Speicher hat, als gebraucht wird.
    Abfangen kannst du das in copystring nicht.

    Deshalb verwendet man gerne string Klassen (zB std::string)

    Da macht man dann ein praktisches

    string s;
    char* hallo=" hallo";
    s.assign(hallo+1, hallo+strlen(hallo));
    


  • strings enden in C++ immer mit einem 0-Byte '\0'.
    alle string-funktionen müssen dieses 0-Byte an einen String anhängen.
    Der String "Hallo" verbraucht somit 6 Bytes.

    Der Zeiger pDest muss mit new oder malloc initialisiert worden sein, damit
    du ihn verwenden kannst.

    pDest = new char[6];
    copystring(pDest, "dlfiasjdfiajewoiwejroiwejro", 5);
    copystring(pDest, "dlfiasjdfiajewoiwejroiwejro", 6); //fehler, auch wenns funktioniert
    ....
    delete []pDest;
    
    // einen string kopieren
    char * copystring(char *pDest, const char *toCopy, int length) 
    {
      if(!pDest)
      {
        printf("Nullpointer exception!\n");
        abort();
      }
      for(int i = 0; i < length; i++) 
      { 
        pDest[i] = toCopy[i];
      }
      pDest[i] = 0;
      return pDest; 
    }
    

    mfg
    Michael



  • CPPhacker schrieb:

    Der Zeiger pDest muss mit new oder malloc initialisiert worden sein, damit du ihn verwenden kannst.

    oder auf ein Array zeigen (so wie in implementors Beispiel)


Anmelden zum Antworten