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?
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.
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;
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.
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;
Commencez par initialiser la structure (static struct PipeShm myPipe = {...
). Alors prenez l'adresse
struct PipeShm * pMyPipe = &myPipe;
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;