C - 错误:创建struct *时,初始化元素不是常量

时间:2017-06-29 16:23:07

标签: c unix gcc struct

我一直在用C语言写一个终端应用程序,我一直有一个奇怪的结构问题。当我尝试编译时,我得到错误“错误:初始化元素不是常量”。非常感谢任何帮助。

这是我的代码:

| user_id | action_type   | action_date | lag_action_date | elapsed_days | cnt_logins_between_action_dates |
|---------|---------------|-------------|-----------------|--------------|---------------------------------|
| 12345   | action_type_1 | 6/27/2017   | 3/3/2017        | 116          | 5                               |
| 12345   | action_type_1 | 3/3/2017    | 2/28/2017       | 3            | 4                               |
| 12345   | action_type_1 | 2/28/2017   | NULL            | NULL         | 1                               |
| 12345   | action_type_2 | 3/6/2017    | 3/3/2017        | 3            | 2                               |
| 12345   | action_type_2 | 3/3/2017    | 3/25/2016       | 343          | 7                               |
| 12345   | action_type_2 | 3/25/2016   | NULL            | NULL         | 1                               |
| 12345   | action_type_4 | 3/6/2017    | 3/3/2017        | 3            | 2                               |
| 12345   | action_type_4 | 3/3/2017    | NULL            | NULL         | 1                               |
| 99887   | action_type_1 | 4/1/2017    | 2/11/2017       | 49           | 8                               |
| 99887   | action_type_1 | 2/11/2017   | 1/28/2017       | 14           | 2                               |
| 99887   | action_type_1 | 1/28/2017   | NULL            | NULL         | 1                               |

2 个答案:

答案 0 :(得分:2)

问题是你在函数外面调用malloc。

这将解决您的问题:

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

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

在C中,如果变量不在任何函数内,则无法在变量init上调用函数。

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?

答案 1 :(得分:1)

这段代码显然不属于任何功能。那么=之后的表达式只能是初始化器,并且初始化器必须是静态的(即可以在编译时计算)但是,调用(在这种情况下为malloc)只能在函数中。所以编译器抱怨。

以下是正确的:

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

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