2017-06-29 91 views
-1

時,我一直在寫在C端應用程序,我一直有與結構一個奇怪的問題初始元素不是常數。當我嘗試編譯時,出現錯誤「錯誤:初始化元素不是常量」。任何幫助是極大的讚賞。Ç - 錯誤:創建結構*

這是我的代碼:

typedef struct { 
    int x; 
    int y; 
    char style; 
} Pixel; 

Pixel *pixels = (Pixel *)malloc(9*128); 
+2

你怎麼知道'的sizeof(像素)''是9'? – tilz0R

+1

此代碼不在任何功能中。但是,_call_(在本例中爲malloc)只能在函數中。 –

回答

2

的問題是,您所呼叫的外部函數malloc。

這將解決你的問題:

typedef struct { 
    int x; 
    int y; 
    char style; 
} Pixel; 

int main(void) { 
    Pixel *pixels = malloc(9 * 128); 
} 

在C你不能調用函數可變初始化,如果變量不是任何函數中。

int a = 5; //OK 
int b = myfunc(); //ERROR, this was your case 
int main() { 
    int c = 5; //OK 
    int d = myfunc(); //OK 
} 

正如從代碼檢查,我假設你認爲你的sizeof(Pixel)9字節,但是這可能並非如此。當你打電話給你的malloc,使用此代碼:

Pixel *pixels = malloc(sizeof(Pixel) * 128); 

此代碼將在單行任何平臺上分配內存128 Pixel結構。


進一步閱讀:

Structure padding and packing

Do I cast the result of malloc?

+0

非常感謝!由於我對C相對比較陌生,有時候我會對全局變量感到困惑。 – emd22

+0

如果它適合您,請將其標記爲正確答案。 @ emd22 – tilz0R

1

此代碼aparently不在任何功能。然後以下=表達只能是一個初始化,以及一個初始值設定必須是靜態的(即可以在編譯時計算)。然而,(在這種情況下的malloc)一個呼叫只能在一個功能。所以編譯器抱怨。

以下是正確的:

typedef struct { 
    int x; 
    int y; 
    char style; 
} Pixel; 

int main(void) 
{ 
    Pixel *pixels = (Pixel *)malloc(sizeof(Pixel)*128); 
    //... 
} 
+0

這將是正確的,如果你沒有砍掉最後的支架:) – Skam

+0

@see飛鏢,你中有我不解:-))? –

+0

您的編輯修復了我突出顯示的語法錯誤。 – Skam