【问题标题】:C - error: initializer element is not constant when creating struct *C - 错误:创建结构时初始化元素不是常量 *
【发布时间】:2017-12-03 11:16:14
【问题描述】:

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

这是我的代码:

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

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

【问题讨论】:

  • 你怎么知道sizeof(Pixel)9
  • 此代码不在任何函数中。但是,调用(在这种情况下是 malloc)只能在函数中。

标签: c unix gcc struct


【解决方案1】:

问题是你在函数外调用 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?

【讨论】:

  • 非常感谢!由于我对 C 语言比较陌生,所以有时我会对使用全局变量感到困惑!
  • 如果它适合您,请将其标记为正确答案。 @emd22
【解决方案2】:

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

以下是正确的:

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

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

【讨论】:

  • 最后一个括号没剪掉就好了:)
  • @See Dart,你让我感到困惑 :-))?
  • 您的编辑修复了我突出显示的语法错误。
猜你喜欢
  • 2014-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-21
  • 2012-04-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多