Ich habe die Header-Dateien meines MSP430-Mikrocontrollers durchsucht und bin auf diese gestoßen <setjmp.h>
:
/* r3 does not have to be saved */
typedef struct
{
uint32_t __j_pc; /* return address */
uint32_t __j_sp; /* r1 stack pointer */
uint32_t __j_sr; /* r2 status register */
uint32_t __j_r4;
uint32_t __j_r5;
uint32_t __j_r6;
uint32_t __j_r7;
uint32_t __j_r8;
uint32_t __j_r9;
uint32_t __j_r10;
uint32_t __j_r11;
} jmp_buf[1]; /* size = 20 bytes */
Ich verstehe, dass es eine anonyme Struktur deklariert und es zu Typedef macht jmp_buf
aber ich kann nicht herausfinden, was die [1]
ist für. Ich weiß, es erklärt jmp_buf
ein Array mit einem Mitglied (dieser anonymen Struktur) zu sein, aber ich kann mir nicht vorstellen, wofür es verwendet wird. Irgendwelche Ideen?
Dies ist ein gängiger Trick, um einen “Referenztyp” in C zu erstellen, bei dem die Verwendung als Funktionsargument dazu führt, dass das Array mit einem einzelnen Element zu einem Zeiger auf sein erstes Element degradiert wird, ohne dass der Programmierer die explizit verwenden muss &
Betreiber, um seine Adresse zu erhalten. Wo deklariert, ist es ein echter Stack-Typ (keine dynamische Zuordnung erforderlich), aber wenn es als Argument übergeben wird, erhält die aufgerufene Funktion einen Zeiger darauf, keine Kopie, sodass es billig übergeben wird (und kann von der aufgerufenen Funktion verändert werden, wenn dies nicht der Fall ist const
).
Den gleichen Trick bedient GMP mit seinen mpz_t
type, und dort ist es kritisch, weil die Struktur einen Zeiger auf dynamisch zugewiesenen Speicher verwaltet; das mpz_init
Die Funktion ist darauf angewiesen, einen Zeiger auf die Struktur zu erhalten, keine Kopie davon, oder sie konnte sie überhaupt nicht initialisieren. In ähnlicher Weise können viele Operationen die Größe des dynamisch zugewiesenen Speichers ändern, und das würde nicht funktionieren, wenn sie die Struktur des Aufrufers nicht ändern könnten.
Hat vielleicht etwas damit zu tun, dass man in einen Zeiger zerfällt?
– Elazar
2. November 2017 um 23:55 Uhr
Der letzte Kommentar scheint völlig falsch zu sein …
– R.. GitHub HÖR AUF, EIS ZU HELFEN
3. November 2017 um 16:21 Uhr