How to initialize a pointer to a struct in C?

前端 未结 6 1798
礼貌的吻别
礼貌的吻别 2020-12-02 17:27

Given this struct:

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


        
相关标签:
6条回答
  • 2020-12-02 17:50

    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;
    
    0 讨论(0)
  • 2020-12-02 18:01

    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.

    0 讨论(0)
  • 2020-12-02 18:09

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

    struct PipeShm * pMyPipe = &myPipe;
    
    0 讨论(0)
  • 2020-12-02 18:11

    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;
    
    0 讨论(0)
  • 2020-12-02 18:11

    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;
    
    0 讨论(0)
  • 2020-12-02 18:14

    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.

    0 讨论(0)
提交回复
热议问题