Как инициализировать указатель на структуру в 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;