2012-07-29 17 views
16

Biorąc pod uwagę ten struct:Jak zainicjować wskaźnik do struct w C?

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

}; 

który działa prawidłowo:

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

Ale kiedy deklarują static struct PipeShm * myPipe, który nie działa, jestem przy założeniu, że będę musiał zainicjować z operatorem ->, ale jak?

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

Czy możliwe jest zadeklarowanie wskaźnika do struktury i użycie z nim inicjalizacji?

+3

trzeba przydzielić pamięci do wskaźnika tak, że można zrobić coś sensownego z nim. Wskaźnik sam w sobie wskazuje na losowy adres. Musisz upewnić się, że adres wskazany przez wskaźnik jest wystarczająco duży, aby pomieścić zawartość struktury. –

+0

Nie rozumiem ... dlaczego potrzebujesz * wskaźnika *? –

+0

Zobacz pytanie [tutaj] (http://stackoverflow.com/questions/2177391/allocating-memory-for-a-structure-in-c) Aby zadeklarować wskaźnik, musisz przydzielić pamięć, aby Twoje pytanie było takie samo rzecz. – rudolph9

Odpowiedz

35

Można to zrobić tak:

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

Funkcja ta nazywana jest „związek dosłowny” i powinno działać dla Ciebie, ponieważ jesteś już przy użyciu C99 wyznaczone inicjatorów.


odniesieniu do przechowywania literałach złożonych:

6.5.2.5-5

Jeśli związek dosłownym zachodzi poza organizmem funkcji, celem ma statyczny czas przechowywania; w przeciwnym razie ma on automatyczny czas przechowywania związany z blokiem obejmującym .

+0

+1. Nie wiedziałem o tym. Skąd bierze się pamięć w tym przypadku? – Jay

+1

@Jay * Miejsce przechowywania tego obiektu jest statyczne (jeśli literał złożony występuje w zakresie pliku) lub automatyczne (jeśli literał złożony występuje w zakresie bloku), a czas przechowywania jest powiązany z jego bezpośrednim blokiem otaczającym * – cnicutar

+0

@ cikutar : Urocza odpowiedź +1 i wybrana. – ron

2

Najpierw trzeba przydzielić pamięci dla wskaźnika poniżej:

myPipe = malloc(sizeof(struct PipeShm)); 

Następnie należy przypisać wartości, jeden po drugim, jak poniżej:

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

Należy pamiętać, że dla każdego wskaźnika wewnątrz strukturę, musisz przydzielić pamięć osobno.

1

Najpierw zainicjuj strukturę (static struct PipeShm myPipe = {...). Następnie podejmuje adres

struct PipeShm * pMyPipe = &myPipe; 
3

Czy jest możliwe aby zadeklarować wskaźnik do struktury i używać inicjalizacji z nim?

Tak.

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

Ok mam to:

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

Jeśli je otrzymałeś, możesz zaakceptować jedną z odpowiedzi: – Michael

+0

@Michael: Gotowe. – ron

0

trzeba budować tego struct ręcznie, a następnie dokonać wskaźnik wskazujący na to pytanie.

albo

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

lub

static struct PipeShm *myPipe = malloc(); 
myPipe->field = value; 
Powiązane problemy