2012-07-29 95 views
16

鉴于这种结构:如何初始化C中的结构指针?

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

是否可以声明一个指向结构的指针并使用它的初始化?

+3

您需要分配内存的指针,以便你可以做任何有意义的事情吧。指针本身只是指向一个随机地址。您需要确保指针指向的地址足够大以容纳结构内容。 – 2012-07-29 14:19:43

+0

我不明白...为什么你需要一个*指针*? – 2012-07-29 14:21:17

+0

查看问题[here](http://stackoverflow.com/questions/2177391/allocating-memory-for-a-structure-in-c)为了声明一个指针,你需要分配内存,所以你的基本要求相同事情。 – rudolph9 2012-07-29 14:23:15

回答

35

你能做到像这样:

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

该功能被称为“复合文字”,它应该,因为你已经在使用C99指定初始化为你工作。


关于存储复合文字的:

6.5.2.5-5

如果字面的化合物发生功能的主体之外,则 对象具有静态存储持续时间;否则,它具有与封闭块相关联的自动存储持续时间 。

+0

+1。不知道这件事。记忆来自哪里? – Jay 2012-07-29 14:29:55

+1

@Jay *这个对象的存储是静态的(如果复合文字发生在文件范围内)或自动的(如果复合文字出现在块范围内),并且存储持续时间与其直接包含的块相关联* – cnicutar 2012-07-29 14:31:27

+0

@cnicutar :可爱的答案+1和选择。 – ron 2012-07-29 14:34:26

2

首先,你需要为指针如下分配内存:

myPipe = malloc(sizeof(struct PipeShm)); 

然后,你应该通过一个如下赋值之一:

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

请注意,每个人里面的指针结构,你需要分别分配内存。

1

首先初始化结构(static struct PipeShm myPipe = {...)。再取地址

struct PipeShm * pMyPipe = &myPipe; 
3

是否有可能宣布一个指向一个结构,然后使用初始化 呢?

是的。

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

好吧我明白了:

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

如果你明白了,你可以接受其中一个答案 – Michael 2012-07-29 14:31:16

+0

@Michael:完成。 – ron 2012-07-29 14:33:45

0

,你必须建立由专人该结构,然后使指针指向了这一点。

要么

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

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