it-swarm.com.de

Wie initialisiere ich einen Zeiger auf eine Struktur in C?

Angesichts dieser Struktur:

struct PipeShm
{
    int init;
    int flag;
    sem_t *mutex;
    char * ptr1;
    char * ptr2;
    int status1;
    int status2;
    int semaphoreFlag;

};

Das funktioniert gut:

static struct PipeShm myPipe = { .init = 0 , .flag = FALSE , .mutex = NULL , 
        .ptr1 = NULL , .ptr2 = NULL , .status1 = -10 , .status2 = -10 , 
        .semaphoreFlag = FALSE };

Aber wenn ich static struct PipeShm * myPipe deklariere, funktioniert das nicht, ich gehe davon aus, dass ich mit dem Operator -> initialisieren muss, aber wie?

static struct PipeShm * myPipe = {.init = 0 , .flag = FALSE , .mutex = NULL , 
        .ptr1 = NULL , .ptr2 = NULL , .status1 = -10 , .status2 = -10 , 
        .semaphoreFlag = FALSE };

Ist es möglich, einen Zeiger auf eine Struktur zu deklarieren und damit die Initialisierung zu verwenden?

18
ron

Sie können es so machen:

static struct PipeShm * myPipe = &(struct PipeShm) {
    .init = 0,
    /* ... */
};

Diese Funktion wird als "zusammengesetztes Literal" bezeichnet und sollte für Sie funktionieren, da Sie bereits mit C99 bezeichnete Initialisierer verwenden.


In Bezug auf die Lagerung von zusammengesetzten Literalen:

6.5.2.5-5

Wenn das zusammengesetzte Literal außerhalb des Rumpfes einer Funktion auftritt, hat das Objekt Eine statische Speicherdauer. Andernfalls wird dem umschließenden Block eine automatische - Speicherdauer zugeordnet.

40
cnicutar

Ist es möglich, einen Zeiger auf eine Struktur zu deklarieren und die Initialisierung Damit zu verwenden?

Ja.

const static struct PipeShm PIPE_DEFAULT = {.init = 0 , .flag = FALSE , .mutex = NULL , .ptr1 = NULL , .ptr2 = NULL ,
        .status1 = -10 , .status2 = -10 , .semaphoreFlag = FALSE };

static struct PipeShm * const myPipe = malloc(sizeof(struct PipeShm));
*myPipe = PIPE_DEFAULT;
4
Brian Cain

Zuerst müssen Sie Speicher für den Zeiger wie folgt reservieren:

myPipe = malloc(sizeof(struct PipeShm));

Dann sollten Sie nacheinander Werte zuweisen:

myPipe->init = 0;
myPipe->flag = FALSE;
....

Bitte beachten Sie, dass Sie für jeden einzelnen Zeiger innerhalb der Struktur den Speicher separat zuweisen müssen.

2
Jay

Okay alles klar : 

static struct PipeShm  myPipeSt = {.init = 0 , .flag = FALSE , .mutex = NULL , .ptr1 = NULL , .ptr2 = NULL ,
        .status1 = -10 , .status2 = -10 , .semaphoreFlag = FALSE };

static struct PipeShm  * myPipe = &myPipeSt;
2
ron

Initialisieren Sie zuerst die Struktur (static struct PipeShm myPipe = {...). Dann nimm die Adresse

struct PipeShm * pMyPipe = &myPipe;
1
oseiskar

sie müssen diese Struktur von Hand erstellen und dann einen Zeiger machen, der darauf zeigt.

entweder 

static struct PipeShm myPipe ={};
static struct PipeShm *pmyPipe = &myPipe;

oder 

static struct PipeShm *myPipe = malloc();
myPipe->field = value;
0
Jokester