Ja, ich bin mir zu etwa 98% sicher. -- ich fand es bei einer "Einzelallokation" immer verwunderlich. So unterschiedlich sind die Geschmäcker.
BTW: Eine statische Allokation macht auch nichts anderes, als einen Block allozieren.
Wichtig aber: Die Größe muss entsprechend teilweise bekannt gemacht werden, also nicht mit int** definieren, sondern mit int[][3]. Hintergrund: Er kann sonst nicht ausrechnen, wie die Größe im speicher liegt. Aber soweit ich das sehe, hat erja eine konstante Größe (3).
Wieso geht das?
int a[17];
a[n] -> a + sizeof(int) * n
Richtig?
Klappt offensichtlich auch bei dynamischer Allozierung.
1.
int a[17][3];
int a[n] -> a + sizeof( int[3] ) * n;
Klar doch?
2.
int* p=a[n] -> p = a + sizeof( int[3] ) * n;
p[m] -> p+ sizeof(int) * m;
klar doch?
3. Einsetzung a[n] = p:
int a[n][m] -> (a+sizeof( int[3] ) * n) + sizeof(int) * m;
Richtig?
Klappt offensichtlich auch bei dynamischer Allozierung.
Ich weiß nicht mehr sytaktisch, welches Array (äußeres oder inneres) man offen lassen darf. Aber so lange nur eines offen ist, was hier der Fall ist, geht das. Hmm, ich schaue es heute abend noch einmal genauer nach. Das Problem ist halt, dass der Compiler den sizeof kennen muss. Bei halboffenen Arrays kennt er den aber.
Ich bin mir wirklich ziemlich sicher.
Ah, habe eine Erläuterung gefunden, die sich mit meiner deckt, jedoch etwas kürzer ist:
pweb.netcom.com/~tjensen/ptr/ch7x.htm
Es ist also so, wie ich es oben gemacht habe: Der linkeste Index kann offen bleiben.
Es ist übrigens ein weiterer Grund, warum Arrays keine Pointer sind, auch wenn das immer wieder falsch behauptet wird.
									
									
								BTW: Eine statische Allokation macht auch nichts anderes, als einen Block allozieren.
Wichtig aber: Die Größe muss entsprechend teilweise bekannt gemacht werden, also nicht mit int** definieren, sondern mit int[][3]. Hintergrund: Er kann sonst nicht ausrechnen, wie die Größe im speicher liegt. Aber soweit ich das sehe, hat erja eine konstante Größe (3).
Wieso geht das?
int a[17];
a[n] -> a + sizeof(int) * n
Richtig?
Klappt offensichtlich auch bei dynamischer Allozierung.
1.
int a[17][3];
int a[n] -> a + sizeof( int[3] ) * n;
Klar doch?
2.
int* p=a[n] -> p = a + sizeof( int[3] ) * n;
p[m] -> p+ sizeof(int) * m;
klar doch?
3. Einsetzung a[n] = p:
int a[n][m] -> (a+sizeof( int[3] ) * n) + sizeof(int) * m;
Richtig?
Klappt offensichtlich auch bei dynamischer Allozierung.
Ich weiß nicht mehr sytaktisch, welches Array (äußeres oder inneres) man offen lassen darf. Aber so lange nur eines offen ist, was hier der Fall ist, geht das. Hmm, ich schaue es heute abend noch einmal genauer nach. Das Problem ist halt, dass der Compiler den sizeof kennen muss. Bei halboffenen Arrays kennt er den aber.
Ich bin mir wirklich ziemlich sicher.
Ah, habe eine Erläuterung gefunden, die sich mit meiner deckt, jedoch etwas kürzer ist:
pweb.netcom.com/~tjensen/ptr/ch7x.htm
Es ist also so, wie ich es oben gemacht habe: Der linkeste Index kann offen bleiben.
Es ist übrigens ein weiterer Grund, warum Arrays keine Pointer sind, auch wenn das immer wieder falsch behauptet wird.
Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
									25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
