2012-07-29 94 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;