C Integer - Pointer Vergleich in For-Schleife

Status
Für weitere Antworten geschlossen.

elektro2

Cadet 4th Year
Registriert
Feb. 2014
Beiträge
67
Hallo zusammen :)

Habe eine Frage. Wenn man einem Pointer ein Array übergibt, steht ja in dem Pointer die Adresse. Bei char wird die Adresse ja immer um einen erhöht. Warum wird das Wort Richtig in diesem Beispiel nicht verändert. ???

Buffer startet ja an folgender Adresse : 1606416613.. Bei dritten durchlauf müsste der pointer ja den Wert
p==1606416615 annehmen. Das 'c' in dem Wort Richtig müsste also zu einem 'a' werden.

Habt ihr eine Idee?

Schöne Grüße !

Code:
#include <stdio.h>

int main()
{
   
    
    char buffer[7]="richtig";
    char *p=buffer;   
    
    printf("%d\n", buffer);  // Adresse ist 1606416613
    
    
    for(int i=0;i<20;i++)
    {
        p=buffer+i;
        if(p==1606416615)
            p[0]='a';         // bei dieser Adresse, wo buffer das c hat, müsste ja ein a sein 
    }
    
    
    
    printf("%s", buffer);
    
    
    return 0;
}
 
Zuletzt bearbeitet:
Warum sollte p jemals den Wert 1606416615 annehmen? Nur dann wird irgendwas verändert.
 
;)
Code:
#include <stdio.h>

int main()
{
    
    char buffer[8]="richtig"; //Du musst den Buffer mit 8 Stellen verwenden, da die 8te Stelle die terminierende Null des Strings ist.
    char *p= &buffer[0]; //Den char-Pointer die Adresse des ersten Chars des Buffer-Arrays geben
    
    printf("%s\n", buffer);
    
     //Solange laufen bis der dereferenzierte Pointer *p nicht die Binäre Null ist (String-Terminator). Mit p++ den Pointer um eine Stelle weiterrücken (Pointer Arithmetik)
    for(;*p;p++)
    {
        if(*p == 'c'){ //Den dereferenzierten Wert abfragen
			*p = 'a'; // und ggf. setzen
		}
        
    }
    
    printf("%s", buffer);
    return 0;
}
 
Danke hat geklappt :)
Habe das Programm nur noch nach meinen Kenntnissen zum bessern Verständnis umgeschrieben :
Code:
#include <stdio.h>

int main()
{
    
    char buffer[8]="richtig";
    char *p= buffer;
    printf("%s\n", buffer);
    
    
    for(int i=0;i<sizeof(buffer);i++)
    {    p=buffer+i;
        if(*p == 'c'){
			p[0] = 'a';
		}
        
    }
    
    printf("%s", buffer);
    return 0;
}
 
*p = buffer und *p = &buffer[0] ist das selbe.
Es sollte aber
printf("%p\n", buffer);
statt "%d\n" heissen, denn buffer ist kein int sondern ein Pointer.

Bei mir ist es so dass die Addresse von buffer bei jedem Aufruf anders ist, weil mein OS Speicherbeireiche
aus sicherheitsgruenden zufaellig vergibt, um Attacken mit fixen Addressen zu erschweren.
Wenn das beim Originalposter auch der Fall ist wird das einfach niemals klappen.

Evtl, falls es ein 64 Bit System war beim Originalposter hat er dank des falschen Prints nur 32 bit von der Addresse
gesehen, und damit waere die (32bit) Konstante mit der er vergleicht auch dann falsch wenn die Addresse konstant waere.

Ist aber unklar, weil ja nix ueber das System gesagt ist.
 
Aber warum das nicht klappt mit if(p==irgendeine Adresse ) leuchtet mir immer noch nicht ein..

Ich meine.. durch z.B. p=buffer+1 bekommt doch p einen Wert um eins höher
Ergänzung ()

Ah ok :) das heißt das man sowas direkt vergessen kann zu schreiben if(p==.....)
 
so klappt es.

Code:
#include <stdio.h>

int main()
{


    char buffer[7]="richtig";
    char *p=buffer;

    printf("%p\n", buffer);


    for(int i=0;i<20;i++)
    {
        p=buffer+i;
        if(p==buffer+2)
            p[0]='a';         // bei dieser Adresse, wo buffer das c hat, müsste ja ein a sein 
    }



    printf("%s", buffer);


    return 0;
}
 
Status
Für weitere Antworten geschlossen.
Zurück
Oben