2017-06-29 78 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