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?
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.
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;
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.
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;
initialiser D'abord la structure (static struct PipeShm myPipe = {...
). Puis prendre l'adresse
struct PipeShm * pMyPipe = &myPipe;
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;