web-dev-qa-db-fra.com

Comment initialiser un pointeur sur une structure en C?

Étant donné cette structure:

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

};

Cela fonctionne bien:

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

Mais lorsque je déclare static struct PipeShm * myPipe, cela ne fonctionne pas, je suppose que je devrais 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 celle-ci?

18
ron

Vous pouvez le faire comme suit:

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

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


En ce qui concerne le stockage de littéraux composés:

6.5.2.5-5

Si le littéral composé survient en dehors du corps d'une fonction, l'objet A une durée de stockage statique; sinon, la durée de stockage automatique est associée au bloc englobant.

40
cnicutar

Est-il possible de déclarer un pointeur sur une structure et d'utiliser l'initialisation Avec celle-ci?

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
Brian Cain

Vous devez d’abord allouer de la mémoire au pointeur comme indiqué ci-dessous:

myPipe = malloc(sizeof(struct PipeShm));

Ensuite, vous devez attribuer les valeurs une par une comme ci-dessous:

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

Veuillez noter que pour chaque pointeur individuel dans la structure, vous devez allouer de la mémoire séparément.

2
Jay

C'est bon je l'ai : 

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

Commencez par initialiser la structure (static struct PipeShm myPipe = {...). Alors prenez l'adresse

struct PipeShm * pMyPipe = &myPipe;
1
oseiskar

vous devez construire cette structure à la main, puis positionner un pointeur sur celle-ci.

non plus 

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

ou 

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