Zugriffs verletzung



  • Moin, ich hab ein Problem mit folgendem Code

    void erase_blanks(char *pos, char *end)
    {
    	for(char* i_pos = pos; i_pos != end; ++i_pos)
    		if((*i_pos) == ' ')
    			for(char* j_pos = i_pos; j_pos != (end-1); ++j_pos)
    			{
    				*j_pos = *(j_pos + 1); // Zugriffsverletzung!!
    				end = end - 1;
    			}
    }
    

    warum hab ich in Zeile 7 eine Zugriffsverletzung ?

    MFG (H)er(r) Müdet



  • Mit dem Debugger hättest du die Antwort in einer halben Minute gefunden.

    void erase_blanks(char *pos,char *end)
    {
      for (char* i_pos=pos;i_pos!=end;++i_pos)
      {
        if ((*i_pos)==' ')
        {
          for (char* j_pos=i_pos;j_pos!=(end-1);++j_pos)
          {
            *j_pos=*(j_pos+1);
          }
          --end;
          --i_pos;
        }
      }
    }
    


  • Äh, ein konstantes string-Literal kannst du nicht ändern?



  • Danke!...stimmt die anpassung der äußeren schleife hab ich versaut... 😞
    trotzdem besteht weiterhin das Prob. das er bei der Zeile

    *j_pos = *(j_pos + 1);
    

    meckert bzgl. einer Zugriffsverletzung.

    Warum ist das ein Konstantes "String-Literal" ?
    Das ist doch nur ein Pointer, der wo hinzeigt, und ein String ist das doch
    nur weil irgentwo im folgenem Speicher iwo ein '\0' steht oder ???
    Solange ich kein const verwende sollte ich doch schreiben drüfen wo ich will oder ?

    MFG (H)er(r) Müdet



  • C++ Standard schrieb:

    An ordinary string literal has type "array of n const char" and static storage duration ...

    ...

    Whether all string literals are distinct (that is, are stored in nonoverlapping objects) is implementation-defined. The effect of attempting to modify a string literal is undefined.



  • Was ist jetzt mit dem Debugger? Er sagt dir genau, welche Werte die Variablen zum Zeit der Zugriffsverletzung haben.
    Ansonsten zeig mal die jetzige Funktion und wie du sie aufrufst.

    Stringliterale sind kein Problem, diese kann man aus ebengenannten Gründen ohnehin nicht an die Funktion übergeben.


Anmelden zum Antworten