30

この構造体を考えると:

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

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

4

6 に答える 6

55

次のように実行できます。

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

この機能は「複合リテラル」と呼ばれ、既に C99 の指定された初期化子を使用しているので、うまくいくはずです。


複合リテラルの格納について:

6.5.2.5-5

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

于 2012-07-29T14:22:03.963 に答える
5

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

はい。

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;
于 2012-07-29T14:22:00.913 に答える
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;
于 2012-07-29T14:22:09.407 に答える
2

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

myPipe = malloc(sizeof(struct PipeShm));

次に、以下のように値を 1 つずつ割り当てる必要があります。

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

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

于 2012-07-29T14:21:05.377 に答える
1

最初に構造体 ( static struct PipeShm myPipe = {...) を初期化します。じゃあアドレス取って

struct PipeShm * pMyPipe = &myPipe;
于 2012-07-29T14:21:52.157 に答える
0

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

また

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

また

static struct PipeShm *myPipe = malloc();
myPipe->field = value;
于 2012-07-29T14:24:32.323 に答える