32

Given this struct:

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

};

That works fine:

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

But when I declare static struct PipeShm * myPipe , that doesn't work , I'm assuming that I'd need to initialize with the operator ->, but how?

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

Is it possible to declare a pointer to a struct and use initialization with it?

3
  • 3
    You need to allocate memory to the pointer so that you can do anything meaningful with it. A pointer by itself just points to an random address.You need to make sure that the address pointed by the pointer is big enough to hold the structure contents. Commented Jul 29, 2012 at 14:19
  • I don't get it... why do you need a pointer ? Commented Jul 29, 2012 at 14:21
  • See question here In order to declare a pointer you need to allocate memory so your basically asking the same thing. Commented Jul 29, 2012 at 14:23

7 Answers 7

62

You can do it like so:

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

This feature is called a "compound literal" and it should work for you since you're already using C99 designated initializers.


Regarding the storage of compound literals:

6.5.2.5-5

If the compound literal occurs outside the body of a function, the object has static storage duration; otherwise, it has automatic storage duration associated with the enclosing block.

Sign up to request clarification or add additional context in comments.

4 Comments

+1. Didn't know about this. Where does the memory come from in this case?
@Jay The storage for this object is either static (if the compound literal occurs at file scope) or automatic (if the compound literal occurs at block scope), and the storage duration is associated with its immediate enclosing block
@cnicutar: Lovely answer +1 & chosen .
if defined in a statement block, we do not need to free the struct pointer, right?
5

Is it possible to declare a pointer to a struct and use initialization with it ?

Yes.

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;

1 Comment

This one uses dynamic memory allocation hence it is not so elegant.
4

Okay I got it :

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;

Comments

3

First you need to allocate memory for the pointer as below:

myPipe = malloc(sizeof(struct PipeShm));

Then, you should assign values one by one as below:

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

Please note that for each individual pointer inside the structure, you need allocate memory seperately.

Comments

1

First initialize the struct (static struct PipeShm myPipe = {...). Then take the address

struct PipeShm * pMyPipe = &myPipe;

Comments

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

2 Comments

you need to cast the struct before you fill it
Consider adding a explanation to your code so it's more helpful to OP and future readers
0

you have to build that struct by hand, and then make a pointer pointing to that.

either

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

or

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

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.