2012-07-29 47 views
16

Dada esta estructura:¿Cómo inicializar un puntero a una estructura en C?

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

}; 

Eso funciona bien:

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

Pero cuando declaro static struct PipeShm * myPipe, eso no funciona, estoy suponiendo que iba a necesitar para inicializar con el operador ->, pero ¿cómo?

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

¿Es posible declarar un puntero a una estructura y usar la inicialización con él?

+3

es necesario asignar memoria para el puntero de modo que se puede hacer algo significativo con ella. Un puntero por sí solo apunta a una dirección aleatoria. Debe asegurarse de que la dirección apuntada por el puntero sea lo suficientemente grande como para contener los contenidos de la estructura. –

+0

No lo entiendo ... ¿por qué necesitas un * puntero *? –

+0

Ver la pregunta [aquí] (http://stackoverflow.com/questions/2177391/allocating-memory-for-a-structure-in-c) Para declarar un puntero, necesita asignar memoria para que, básicamente, se pregunte lo mismo cosa. – rudolph9

Respuesta

35

Puede hacerlo de esta manera:

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

Esta función se denomina un "compuesto literal" y debería funcionar para usted ya que ya está usando C99 inicializadores designados.


En cuanto al almacenamiento de literales compuestos:

6.5.2.5-5

Si el compuesto literal se produce fuera del cuerpo de una función, el objeto tiene una duración de almacenamiento estático; de lo contrario, tiene una duración de almacenamiento automática asociada con el bloque adjunto.

+0

+1. No sabia sobre esto. ¿De dónde viene la memoria en este caso? – Jay

+1

@Jay * El almacenamiento para este objeto es estático (si el literal compuesto ocurre en el alcance del archivo) o automático (si el literal compuesto ocurre en el alcance del bloque) y la duración de almacenamiento está asociada con su bloque de cierre inmediato * – cnicutar

+0

@cnicutar : Hermosa respuesta +1 y elegida. – ron

2

Primero debe asignar memoria para el puntero de la siguiente manera:

myPipe = malloc(sizeof(struct PipeShm)); 

Entonces, usted debe asignar valores uno por uno de la siguiente manera:

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

Tenga en cuenta que para cada puntero del individuo en el interior la estructura, necesita asignar memoria por separado.

1

Primero inicialice la estructura (static struct PipeShm myPipe = {...). Luego tomar la dirección de

struct PipeShm * pMyPipe = &myPipe; 
3

¿Es posible declarar un puntero a una estructura y el uso de inicialización con ella?

Sí.

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

yo bien se que:

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

Si lo tiene, puede aceptar una de las respuestas – Michael

+0

@Michael: Listo. – ron

0

usted tiene que construir esa estructura con la mano y, a continuación, hacer un puntero que apunta a eso.

ya sea

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

o

static struct PipeShm *myPipe = malloc(); 
myPipe->field = value; 
Cuestiones relacionadas