Как инициализировать указатель на структуру в C?

С учетом этой структуры:

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

};

Это прекрасно работает:

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

Но когда я объявляю static struct PipeShm * myPipe, это не работает, я предполагаю, что мне нужно будет инициализировать с помощью оператора ->, но как?

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

Можно ли объявить указатель на структуру и использовать с ней инициализацию?

Ответы

Ответ 1

Вы можете сделать это так:

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

Эта функция называется "составным литералом", и она должна работать для вас, поскольку вы уже используете инициализаторы, назначенные C99.


Что касается хранения составных литералов:

6.5.2.5-5

Если составной литерал выходит за пределы тела функции, объект имеет статическую продолжительность хранения; в противном случае он автоматически время хранения, связанное с закрывающим блоком.

Ответ 2

Можно ли объявить указатель на структуру и использовать инициализацию с ним?

Да.

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;

Ответ 3

Сначала вам нужно выделить память для указателя, как показано ниже:

myPipe = malloc(sizeof(struct PipeShm));

Затем вы должны назначать значения один за другим, как показано ниже:

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

Обратите внимание, что для каждого отдельного указателя внутри структуры вам необходимо выделить память отдельно.

Ответ 4

Хорошо, я понял:

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;

Ответ 5

Сначала инициализируйте struct (static struct PipeShm myPipe = {...). Затем возьмите адрес

struct PipeShm * pMyPipe = &myPipe;

Ответ 6

вам нужно собрать эту структуру вручную, а затем сделать указатель, указывающий на это.

либо

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

или

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