Bei der Zuweisung von Speicher für einen Zeiger auf einen Datensatz benötige ich auch Platz für einen ganzzahligen Zeiger, der unmittelbar vor dem zugewiesenen Datensatz liegt. Dieser Zeiger kann nicht Teil des Datensatzes selbst sein und kann nicht nach dem Datensatz platziert werden. Mein derzeitiger Ansatz ist der folgende:Datensatz mit Variable bei negativem Offset zuweisen
#include <stdlib.h>
static int n;
struct { int f; } *p;
p = malloc(sizeof (int *) + sizeof *p);
if (p != NULL) {
p = (void *) ((int **) p + 1);
*((int **) p - 1) = &n;
}
Sind die Gussformen gut definiert? Wenn nicht, was sollte ich stattdessen tun?
Edit:
Was ich versuche zu erreichen ist erweiterbar Aufzeichnungen (OOP) und den Integer-Zeiger implementieren stellen eine Art ID. Ein erweiterter Datensatz sollte mit seinem Basistyp kompatibel sein. Ich benötige jedoch nur Typ ID: s für Zeiger auf Datensätze. Hier ist ein komplettes Beispiel:
#include <assert.h>
#include <stdlib.h>
struct T0 {
int f;
};
int T0ID;
struct T1 {
struct T0 base;
int g;
};
int T1ID;
int main(void)
{
struct T0 *x;
struct T1 *y;
y = malloc(sizeof (int *) + sizeof *y);
if (y != NULL) {
*((int **) y) = &T1ID;
y = (void *) ((int **) y + 1);
((struct T0 *) y)->f = 1;
y->g = 2;
}
x = (struct T0 *) y;
assert(x->f == 1);
return 0;
}
Sie müssen Rechnung Alignement berücksichtigen. –
Können Sie eine Struktur von Zeiger auf int und die Struktur, die Sie verwenden möchten, machen? Dann für diese Struktur zuweisen und einen Zeiger auf struct member erhalten? – Yunnosch
Können Sie Ihr Code-Snippet auf ein [MCVE] aktualisieren, was ein wenig mehr zeigt, wie Sie das Konstrukt verwenden möchten? – Yunnosch