web-gelistirme-sc.com

Bir işaretçi C bir yapıya nasıl başlatılır?

Bu yapı göz önüne alındığında:

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

};

Bu iyi çalışıyor:

static struct PipeShm myPipe = { .init = 0 , .flag = FALSE , .mutex = NULL , 
        .ptr1 = NULL , .ptr2 = NULL , .status1 = -10 , .status2 = -10 , 
        .semaphoreFlag = FALSE };

Ama static struct PipeShm * myPipe 'u bildirdiğimde bu işe yaramazsa, -> operatörü ile başlatmam gerekeceğini sanıyorum, ama nasıl?

static struct PipeShm * myPipe = {.init = 0 , .flag = FALSE , .mutex = NULL , 
        .ptr1 = NULL , .ptr2 = NULL , .status1 = -10 , .status2 = -10 , 
        .semaphoreFlag = FALSE };

Bir yapıya bir işaretçi koymak ve onunla ilklendirmeyi kullanmak mümkün müdür?

18
ron

Böyle yapabilirsin:

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

Bu özelliğe "bileşik hazır bilgi" adı verilir ve zaten C99 ile atanan başlatıcıları kullandığınızdan sizin için çalışmalıdır.


Bileşik değişmezlerin depolanması ile ilgili olarak:

6.5.2.5-5

Bileşik hazır bilgi bir fonksiyonun gövdesi dışında meydana gelirse, Nesnesi statik saklama süresine sahiptir; Aksi takdirde, kapatma bloğu ile ilişkili otomatik depolama süresi vardır.

40
cnicutar

Bir yapıya bir işaretçi koymak ve onunla İlklendirmeyi kullanmak mümkün mü?

Evet.

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

Öncelikle, işaretçi için hafızayı aşağıdaki gibi ayırmanız gerekir:

myPipe = malloc(sizeof(struct PipeShm));

Ardından, değerleri aşağıdaki gibi birer birer atamalısınız:

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

Yapının içindeki her bir işaretçi için, belleği ayrı olarak ayırmanız gerektiğini lütfen unutmayın.

2
Jay

Tamam anladım : 

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;
2
ron

İlk önce yapıyı başlatın (static struct PipeShm myPipe = {...). O zaman adresi al

struct PipeShm * pMyPipe = &myPipe;
1
oseiskar

bu yapıyı elle inşa etmeniz ve bunu gösteren bir işaretçi koymanız gerekir.

ya 

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

veya 

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