Andi S. wrote:
> Aha wieder was dazu gelernt.
>
>> Da es eine lokale Variable ist, liegen diese 10 Bytes auf dem Stack.
>> Aber was interessiert es dich, wo genau diese 10 Bytes liegen?
>
> Wenn ich z.B. 500 Bytes speichern möchte wird das, je nach µC, mit dem
> Stack ja schon eng (das ist wahrscheinlich so ein Assemblertick, immer
> wissen zu wollen wie was funktioniert).
Das muss man auch in C wissen, sonst liegst du früher oder später auf
der Nase...
> Gibt es denn überhaupt eine Möglichkeit den sram gezielt anzusprechen?
Es gibt unterschiedlliche Speicherklassen in C:
auto (die normalen lokalen Variablen) leben in Registern oder auf dem
Stack oder sind wegoptimiert, gültig innerhalb des Blocks, in dem sie
stehen.
static stehen, wie der Name sagt, statisch im RAM. Haben also
unbegrenzte Gültigkeitsdauer.
extern dito, allerdings mit Sichtbarkeit über Modulgrenzen hinweg.
dynamisch via malloc et al. besorgter Speicher (auf nem kleiner µC
eher der Overkill)
exoten es gibt auch Mischformen von auto und global, etwa bei lokalen
Funktionen die über Trampolines betreten werden. Aber recht speziell
das...
Wenn Du also schreibst
1 | extern int A; // steht üblicherweise im Header (.h)
|
2 | int A;
|
3 | static int B;
|
4 |
|
5 | int * foo (void)
|
6 | {
|
7 | static int c;
|
8 | static int e;
|
9 | int d;
|
10 |
|
11 | return &e;
|
12 | }
|
Ist A extern und in anderen Modulen zugreifbar, steht im RAM bzw. kommt
erstmal in eine bestimmte Section (.text) welche dann im RAM landet.
B ist static (RAM).
c,e sind auch static (überleben verlassen von foo). Ihre Adresse ist
ausserhalb von foo gültig.
d ist lokal (auto), die Adresse von d ist ausserhalb von foo nicht
gültig.