How to initialize a pointer to a struct in C?
Asked Answered
G

7

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?

Good answered 29/7, 2012 at 14:17 Comment(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.Wasp
I don't get it... why do you need a pointer ?Job
See question here In order to declare a pointer you need to allocate memory so your basically asking the same thing.Dumond
H
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.

Hernia answered 29/7, 2012 at 14:22 Comment(4)
+1. Didn't know about this. Where does the memory come from in this case?Mohler
@Mohler 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 blockHernia
@cnicutar: Lovely answer +1 & chosen .Good
if defined in a statement block, we do not need to free the struct pointer, right?Underwriter
J
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;
Jaques answered 29/7, 2012 at 14:22 Comment(1)
This one uses dynamic memory allocation hence it is not so elegant.Orangeman
G
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;
Good answered 29/7, 2012 at 14:22 Comment(0)
M
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.

Mohler answered 29/7, 2012 at 14:21 Comment(0)
W
1

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

struct PipeShm * pMyPipe = &myPipe;
Wireman answered 29/7, 2012 at 14:21 Comment(0)
D
1
static struct PipeShm * myPipe = &(struct PipeShm) {.init = 0 , .flag = FALSE , .mutex = NULL , 
        .ptr1 = NULL , .ptr2 = NULL , .status1 = -10 , .status2 = -10 , 
        .semaphoreFlag = FALSE };
Disendow answered 15/12, 2022 at 19:44 Comment(2)
you need to cast the struct before you fill itDisendow
Consider adding a explanation to your code so it's more helpful to OP and future readersDevastation
R
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;
Rabah answered 29/7, 2012 at 14:24 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.