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 dazuaber 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
F0000was 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
F0000Die 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'"