web-dev-qa-db-ja.com

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 };

構造体へのポインタを宣言し、それで初期化を使用することは可能ですか?

22
JAN

あなたはそうすることができます:

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

この機能は「複合リテラル」と呼ばれ、すでにC99指定イニシャライザを使用しているため、機能します。


複合リテラルの保管について:

6.5.2.5-5

複合リテラルが関数の本体の外にある場合、オブジェクトには静的ストレージ期間があります。それ以外の場合は、囲んでいるブロックに関連付けられた自動ストレージ期間があります。

46
cnicutar

構造体へのポインタを宣言し、それで初期化を使用することは可能ですか?

はい。

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;
5
Brian Cain

わかった :

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;
3
JAN

最初に、以下のようにポインタにメモリを割り当てる必要があります。

myPipe = malloc(sizeof(struct PipeShm));

次に、次のように値を1つずつ割り当てます。

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

構造内の個々のポインタごとに、メモリを個別に割り当てる必要があることに注意してください。

2
Jay

まず、構造体(static struct PipeShm myPipe = {...)。その後、アドレスを取る

struct PipeShm * pMyPipe = &myPipe;
1
oseiskar

手でその構造体を作成し、それを指すポインタを作成する必要があります。

どちらか

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

または

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