Wie sieht das Speicherabbild aus?



  • Hi,

    ich schreibe bald eine Klausur zum Themengebiet C++.
    ich habe alte klausuren die ich lerne, jedoch habe ich keine antworten dazu 😕

    aber in jeder klausur kommen immer 2 aufgaben dran, die vom styl her gleich sind, deswegen wollte ich mich darüber nochmals informieren. (Keine vorlesung mehr oder übung, sonst würde ich den Prof fragen, mit studierende ist auch nicht immer 100%tig richtig )

    gegeben is der folgende programmteil:

    int n[3]={10,11,12};
    int * pn=n;
    *(pn+2)=*pn+(pn+1);

    Zeichnen sie das Speicherabbild, wie es sich nach der letzten Programmzeile darstellt.

    dann habe ich eine tabelle die sieht wie folgt aus

    Adresse Speicherinhalt
    F00c
    F008
    F004
    F0000

    was muss ich tun?

    und dann noch:
    geben sei die inhalte aller variablen nach Ausführung der jeweiligen Programmzelle in der vorbeireteten tabelle an.

    program:
    1. int f(int *x, int n)
    2. {
    3. int z=0;
    4. for (z=2; *x<n; z++)
    5. *x = *x * z;
    6. return z+*x;
    7. }
    8.
    9. void main (void)
    10. {
    11. int x=1, y=2;
    12. y=f(&x,3);
    13. }

    mein problem ist nur, in z.12 gibt er ja in &x an die funktion.
    er übergibt ja mit dem & befehl die adresse.
    arbeite ich dann quasi nur mit dem normalen x wert weiter, also 1?
    oder muss ich da was beachten?

    wäre echt nett wenn da mal einer schnell rüberschauen könnte.

    grüße 🙂



  • Riddick__ schrieb:

    ich schreibe bald eine Klausur zum Themengebiet C++.

    zum Themengebiet C.

    Riddick__ schrieb:

    ich habe alte klausuren die ich lerne, jedoch habe ich keine antworten dazu 😕

    😃

    Riddick__ schrieb:

    int n[3]={10,11,12};
    int * pn=n;
    *(pn+2)=*pn+(pn+1);
    

    Zeichnen sie das Speicherabbild, wie es sich nach der letzten Programmzeile darstellt.

    dann habe ich eine tabelle die sieht wie folgt aus

    Adresse Speicherinhalt
    F00c
    F008
    F004
    F0000

    Die Aufgabe ist doch nur doof. Ich will ein int nicht in seine einzelnen Bytes aufdröseln. Und das sollte wohl F000 heißen, oder?

    Riddick__ schrieb:

    geben sei die inhalte aller variablen nach Ausführung der jeweiligen Programmzelle in der vorbeireteten tabelle an.

    program:

    int f(int *x, int n)
     {
     int z=0;
      for (z=2; *x<n; z++)
      *x = *x * z;
      return z+*x;
      }
    
      void main (void)
      {
     int x=1, y=2;
      y=f(&x,3);
      }
    

    mein problem ist nur, in z.12 gibt er ja in &x an die funktion.
    er übergibt ja mit dem & befehl die adresse.
    arbeite ich dann quasi nur mit dem normalen x wert weiter, also 1?
    oder muss ich da was beachten?

    Das einzige, das das Porgramm ausgibt, ist ein Compilerfehler, weil es void main nicht gibt. Aber gut, nehmen wir an es wäre int main. Dann hast Recht. Die Funktion f bekommt die Adresse der Variablen x übergeben und somit greifst du in f auf sie zu und änderst ihren Wert. Ja, dein Prof. will halt, dass du weißt, dass sich nach Abarbeitung der Funktion f die Variable x verändert hat.



  • Nur, falls es dich noch interessiert:

    int n[3]={10,11,12};//Array, 3 Werte lang, jeweils 10, 11 und 12
    
    int * pn = n;//Zeiger wird kopiert, pn und n zeigen jetzt auf obiges Array
    
    * ( pn + 2) = * pn + ( pn + 1); //Das Dritte Array-Element wird auf 10 + pn + 1 gesetzt
    

    Jetzt ist folgendes wichtig:

    A[5]     = 5[A]
     = *(A + 5) = *(5 + A);
    

    Jetzt interessiert nur noch pn, welches ja ein (AFAIK) zufälliger Speicher-Adressen Wert ist;

    Die Tabelle sieht also folgendermaßen aus.

    10
    11
    [i]pn[/i] + 11
    

    Edit: Oben ist wahrscheinlich nicht * pn + ( pn + 1) sondern * pn + *( pn + 1) (ja, da gibt's einen Unterschied 😃 ) gemeint. Sonst gibt's einen Compiler-Error wegen falscha Casts, sonst geht das aber auch mit reinterpret_cast .



  • Riddick__ schrieb:

    Zeichnen sie das Speicherabbild, wie es sich nach der letzten Programmzeile darstellt.

    "error: '::main' must return 'int'"


Log in to reply