2013-08-26 34 views
1

與海灣合作委員會(GCC)的工作,我嘗試編譯這個程序 -結構intitialization符號不與4.4.6堆中分配存儲

1 #include <stdio.h> 
    2 #include <stdlib.h> 
    3 
    4 int main(int argc, char *argv[]) 
    5 { 
    6 
    7  struct B { 
    8   int i; 
    9   char ch; 
10  }; 
11 
12  struct B *ptr; 
13 
14  ptr = (struct B*) calloc(1, sizeof(struct B)); 
15 
16  *ptr = { 
17   .i = 10, 
18   .ch = 'c', 
19  }; 
20 
21  printf("%d,%c\n", ptr->i, ptr->ch); 
22 
23  return 0; 
24 } 
25 

$ make 
gcc -g -Wall -o test test.c 
test.c: In function ‘main’: 
test.c:16: error: expected expression before ‘{’ token 
make: *** [test] Error 1 

回答

2
*ptr = { 
    .i = 10, 
    .ch = 'c', 
}; 

這種用法稱爲指定初始化,正如其名暗示,它僅用於初始化結構或數組,但您要做的是分配

指定初始化的正確用法:

strcut B foo = {.i = 10, .ch = 'c'}; 

要分配結構,你仍然需要使用:

ptr->i = 10; 
ptr->ch = 'c'; 

編輯:或者你可以使用一個複合文字像@安德烈T的回答:

*ptr = (struct B) { 
    .i = 10, 
    .ch = 'c', 
}; 
+0

可能是他還需要一個**指定初始值設定項**的示例** –

+0

@LidongGuo添加了示例,但這不適用於堆對象。 –

+0

好吧,「不可能」是一個字符串詞,考慮到OP要做的事可以通過* compound literal *來完成,如我的答案所示。從概念上講,這當然不是同一回事,但實際上它只是在OP中希望它做的事情上做些小改動。 – AnT

0

在一個結構初始值設定項,指定要用'初始化的字段的名稱。 'fieldname ='元素值之前。例如,給定以下結構,

struct point {int x,y; };

以下初始化

結構點p = {.Y =值1,.X =值2};

相當於

結構點p = {value1,value2};

具有相同的含義,「字段名:」的另一種語法,如下所示:

結構點p = {Y:值2,X:VALUE1};

'[index]'或'。 fieldname'被稱爲指示符。下面的代碼將工作。對於指針YU Hao告訴..

#include<stdio.h> 
#include<stdlib.h> 


int main(int argc, char *argv[]) 
{ 

    struct B { 
     int i; 
     char ch; 
    } ; 

    struct B name = { 
     .i = 10, 
     .ch = 'c', 
    }; 

    printf("%d,%c\n", name.i, name.ch); 

    return 0; 
} 
0
*ptr = { 
    .i = 10, 
    .ch = 'c', 
}; 

這種用法稱爲指定初始化並且只使用初始化時不分配。據我所知它不是一個指針,因爲只有4個字節被分配給任何指針。

3

你正在談論的「Struct初始化符號」使用術語「初始化」有一個原因:它打算在初始化上下文中使用。你所要做的並不是初始化。這是任務。這種語法不會立即在賦值語境中工作。

爲了仍然使用這種方便的語法,您必須創建另一個相同類型的結構體,使用此語法對其進行初始化,然後使用賦值將該結構體複製到您的結構體中。例如

ptr = calloc(1, sizeof *ptr); 

const struct B INIT = { 
    .i = 10, 
    .ch = 'c', 
}; 

*ptr = INIT; 

這已經實現了你正在嘗試做的,但你可以使用C語言的複合文字功能

ptr = calloc(1, sizeof *ptr); 

*ptr = (struct B) { 
    .i = 10, 
    .ch = 'c', 
}; 

基本上,後者代碼作出上述更緊湊樣品可能是你在找什麼。但是請注意,在概念上這仍然不是初始化。這是一項任務,它創建一個struct B類型的臨時對象,然後將其分配給您的*ptr對象。

1

如果你想初始化(分配值)動態分配的結構,你將需要使用C99複合文字的賦值的RHS:

#include <stdio.h> 
#include <stdlib.h> 

int main(void) 
{ 
    struct B { int i; char ch; }; 
    struct B *ptr = (struct B*) calloc(1, sizeof(struct B)); 
    *ptr = (struct B){ .i = 10, .ch = 'c', }; 

    printf("%d,%c\n", ptr->i, ptr->ch); 
    return 0; 
} 

標記使用一個演員和一個初始化器,而不僅僅是一個初始化器。