C: Zwei Arrays - eine Speicheradresse???



  • Hallo leute...
    ich hab da zwei verschiedene arrays aber die gleiche speicheradresse... weiß jemand die antwort???

    #include <stdio.h>
    
    int main(){
        int i;
        for(i = 0; i < 2; i++){
            if(i == 0){
                char buf[5];
                printf("Adresse von 1 %p\n", buf);
            }
            else {
                char buf2[5];
                printf("Adresse von 2 %p\n", buf2);
            }
         }
    
    }
    

    aaa@bbb:~/Desktop$ ./a.out
    Adresse von 1 0x7fff5522aab0
    Adresse von 2 0x7fff5522aab0
    aaa@bbb:~/Desktop$



  • Wo ist dein Problem die Arrays existieren doch eh nie gleichzeitig. 😕



  • Die beiden Arrays sind jeweils auf den umgebenden Block beschränkt und fliegen bei der schließenden Klammer aus dem Scope. Da ist es absulut legal, den Speicherplatz zu recyclen, wenn die Variable an dieser Stelle nicht gültig ist.



  • dh dass buf bei i=1 gar nicht existiert?



  • aha ok, vielen dank... ich denke ich sollte dann auf malloc umsteigen


  • Mod

    maximillian schrieb:

    dh dass buf bei i=1 gar nicht existiert?

    Ja.


  • Mod

    maximillian schrieb:

    aha ok, vielen dank... ich denke ich sollte dann auf malloc umsteigen

    Wieso? Was hast du überhaupt vor?



  • maximillian schrieb:

    dh dass buf bei i=1 gar nicht existiert?

    Ja, das heißt es.

    maximillian schrieb:

    aha ok, vielen dank... ich denke ich sollte dann auf malloc umsteigen

    Nur wenn du genau weißt, was du da machst. Eventuell reicht es auch, die Arrays static zu definieren, aber dazu weiß ich zu wenig über die Hintergründe der Frage.



  • ich hab das jetzt so umgebaut, denke das passt...

    char * buf = (char *)malloc((strlen(argv[i]) + 1)*sizeof(char));
    


  • 1. sizeof(char) ist immer 1
    2. malloc() sollte man eigentlich möglichst vermeiden, was willst du erreichen?



  • 3. Und ich hoffe, du hast das dazugehörige free() nicht vergessen



  • cooky451 schrieb:

    1. sizeof(char) ist immer 1
    2. malloc() sollte man eigentlich möglichst vermeiden, was willst du erreichen?

    ja ich weiß, dass man malloc möglichst vermeiden sollte, aber in diesem fall gehts nicht anders.

    mit dieser zeile möchte ich so viel speicherplatz reservieren, wie viel ich brauche. also wenn die eingabe = "Eingabe" == 7 Zeichen lang ist + 1 ergibt = 8. 8 * sizeof(char) genau so viel speicherplatz um "Eingabe" abzuspeichern. + 1 zeichen ist wegen dieser '\0', da weiß ich nicht genau, ob ich die immer brauche, aus sicherheitsgründen schleppe ich sie immer mit



  • CStoll schrieb:

    3. Und ich hoffe, du hast das dazugehörige free() nicht vergessen

    ne habe ich nicht... die datenstrucktur wird bis zum schluss gebraucht und beim schliessen des programms wird der speicher sowieso freigegeben



  • Startparameter noch mal zu kopieren scheint mir irgendwie ziemlich sinnlos. Sicher, dass du das nicht anders machen kannst? Was stellst du denn mit argv[i] böses an? 😕



  • Dir ist schon klar, daß für den Zeiger buf die selben Scope-Regeln gelten wie für die Arrays im Eröffnungsbeitrag - sobald sie aus dem Gültigkeitsbereich fallen, ist ihr Wert futsch und damit auch der Speicher, den du per malloc() angefordert hast. Sowas nennt sich i.a. "Speicherleck".

    Was willst du denn eigentlich mit dieser "datenstrucktur" erreichen? Das sieht so aus, als ob du möglicherweise zu kompliziert gedacht hast.

    PS: gegen das "+1" sagt niemand etwas, aber das "sizeof(char)" ist redundant 😉



  • Reicht es nicht aus, die beiden Buffer direkt beim i zu definieren?



  • cooky451 schrieb:

    Startparameter noch mal zu kopieren scheint mir irgendwie ziemlich sinnlos. Sicher, dass du das nicht anders machen kannst? Was stellst du denn mit argv[i] böses an? 😕

    ich brauch ein paar ausführungen davon. denn beim

    file = fopen(strcat(argv[i], ".txt"), "w+")
    

    schreib strcat alles in argv rein. so kann ich argv[i] nicht mehr gescheit verwenden



  • Das darfst du auch nicht machen, denn du weißt ja nicht, wie viel Platz in argv[i ] ist.



  • CStoll schrieb:

    Dir ist schon klar, daß für den Zeiger buf die selben Scope-Regeln gelten wie für die Arrays im Eröffnungsbeitrag - sobald sie aus dem Gültigkeitsbereich fallen, ist ihr Wert futsch und damit auch der Speicher, den du per malloc() angefordert hast. Sowas nennt sich i.a. "Speicherleck".

    Was willst du denn eigentlich mit dieser "datenstrucktur" erreichen? Das sieht so aus, als ob du möglicherweise zu kompliziert gedacht hast.

    PS: gegen das "+1" sagt niemand etwas, aber das "sizeof(char)" ist redundant 😉

    also dann sollte ich ne fehlermeldung bekommen, wenn ich diesen speicherbereich weiter übergebe und benutze??? bis jetzt läuft es einwandfrei



  • maximillian schrieb:

    cooky451 schrieb:

    Startparameter noch mal zu kopieren scheint mir irgendwie ziemlich sinnlos. Sicher, dass du das nicht anders machen kannst? Was stellst du denn mit argv[i] böses an? 😕

    ich brauch ein paar ausführungen davon. denn beim

    file = fopen(strcat(argv[i], ".txt"), "w+")
    

    schreib strcat alles in argv rein. so kann ich argv[i] nicht mehr gescheit verwenden

    Also für diese Aktion reicht der Platz aus deinem obigen malloc()-Aufruf aber definitiv auch nicht aus.



  • Irgendwie ist mir immer noch nicht klar was das werden soll. Erkläre doch einmal kurz was genau du erreichen willst bzw. was dein Programm macht, ich denke dann können wir dir sehr viel besser helfen.


Anmelden zum Antworten