この構造体を考えると:
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 };
構造体へのポインタを宣言し、それで初期化を使用することは可能ですか?
あなたはそうすることができます:
static struct PipeShm * myPipe = &(struct PipeShm) {
.init = 0,
/* ... */
};
この機能は「複合リテラル」と呼ばれ、すでにC99指定イニシャライザを使用しているため、機能します。
複合リテラルの保管について:
6.5.2.5-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;
わかった :
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;
最初に、以下のようにポインタにメモリを割り当てる必要があります。
myPipe = malloc(sizeof(struct PipeShm));
次に、次のように値を1つずつ割り当てます。
myPipe->init = 0;
myPipe->flag = FALSE;
....
構造内の個々のポインタごとに、メモリを個別に割り当てる必要があることに注意してください。
まず、構造体(static struct PipeShm myPipe = {...
)。その後、アドレスを取る
struct PipeShm * pMyPipe = &myPipe;
手でその構造体を作成し、それを指すポインタを作成する必要があります。
どちらか
static struct PipeShm myPipe ={};
static struct PipeShm *pmyPipe = &myPipe;
または
static struct PipeShm *myPipe = malloc();
myPipe->field = value;