2017-05-03 59 views
-1

C11給我們帶來了整潔的結構初始化語法:任何方式來初始化動態分配的結構?

struct some_struct {int some; char value;}; 
struct some_struct s = {.some = 5, .value = 'a'}; 
printf("some = %d, value = %c\n", s.some, s.value); 

http://ideone.com/zZxTc4

但是,它似乎不工作的時候該結構具有動態分配:

struct some_struct {int some; char value;}; 
struct some_struct *s = malloc(sizeof(struct some_struct)); 
*s = {.some = 5, .value = 'a'}; 
printf("some = %d, value = %c\n", s->some, s->value); 

此代碼產量:

error: expected expression before ‘{’ token 
    *s = {.some = 5, .value = 'a'}; 
    ^

http://ideone.com/nBiorw

struct some_struct {int some; char value;}; 
struct some_struct *s = malloc(sizeof(struct some_struct)); 
*s = struct some_struct {.some = 5, .value = 'a'}; 
printf("some = %d, value = %c\n", s->some, s->value); 

而這種代碼可得:

error: expected expression before ‘struct’ 
    *s = struct some_struct {.some = 5, .value = 'a'}; 
     ^~~~~~ 

http://ideone.com/SpBX1E

是否有任何C的方式來初始化動態分配的結構是很好的或者我寧願寫類似的東西:

struct some_struct {int some; char value;}; 
struct some_struct *s = malloc(sizeof(struct some_struct)); 
s->some = 5; 
s->value = 'a'; 
printf("some = %d, value = %c\n", s->some, s->value); 

http://ideone.com/1XAiQS

因爲(a)它意味着該結構的每個成員都佔有自己的路線,因爲人們往往當他們看到不是一個;標誌其行的源代碼的最後標誌皺眉哪個稍微不便是,和(b)我不能像在正常的結構體初始化中那樣依賴初始化爲0的未指定的值。

回答

3

在你的代碼

*s = {.some = 5, .value = 'a'}; 

initialization,這是一個assignment

Brace enclosed initializer只能在初始化期間使用。

您可以使用compound literal,雖然。像

*s = (struct some_struct){.some = 5, .value = 'a'}; 

將完成這項工作。

+0

限定「initialiser」struct#「const」,否則根據編譯器優化程度的不同,最終可能會有兩個副本。儘管它是名稱,但是_compound literal_不是一個常量。 – Olaf

+0

只要補充一點,這仍然不是初始化,而是一項任務。 –

+0

@AjayBrahmakshatriya對,我們正在努力使作業在那裏工作。 :) –