Comment initialiser un pointeur vers une structure en C?

compte tenu de cette structure:

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

};

Qui fonctionne très bien:

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

mais quand je déclare static struct PipeShm * myPipe , qui ne fonctionne pas , je suppose que j'avais besoin de l'initialiser avec l'opérateur ->, mais comment?

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

est-il possible de déclarer un pointeur sur une structure et d'utiliser l'initialisation avec elle?

18
demandé sur Mateusz Piotrowski 2012-07-29 18:17:19

6 réponses

Vous pouvez le faire comme ceci:

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

cette fonctionnalité s'appelle un "composé littéral" et devrait fonctionner pour vous puisque vous utilisez déjà des initialiseurs C99 désignés.


concernant le stockage de la littérature composée:

6.5.2.5-5

Si le littéral composé se produit à l'extérieur du corps d'une fonction, la objet a la durée de stockage statique; autrement, il a automatique durée de stockage associée à la bloc enfermant.

37
répondu cnicutar 2012-07-29 14:33:50

est-il possible de déclarer un pointeur vers une structure et d'utiliser l'initialisation avec elle ?

Oui.

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
répondu Brian Cain 2012-07-29 14:22:00

d'Abord, vous devez allouer de la mémoire pour le pointeur comme ci-dessous:

myPipe = malloc(sizeof(struct PipeShm));

ensuite, vous devriez assigner des valeurs un par un comme ci-dessous:

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

veuillez noter que pour chaque pointeur individuel à l'intérieur de la structure, vous devez allouer la mémoire séparément.

2
répondu Jay 2012-07-29 14:21:05

d'Accord je l'ai eu :

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
répondu ron 2012-07-29 14:22:09

initialiser D'abord la structure (static struct PipeShm myPipe = {...). Puis prendre l'adresse

struct PipeShm * pMyPipe = &myPipe;
1
répondu oseiskar 2012-07-29 14:21:52

vous devez construire cette structure par la main, et ensuite faire un pointeur pointant vers.

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

ou

static struct PipeShm *myPipe = malloc();
myPipe->field = value;
0
répondu Jokester 2012-07-29 14:24:32