首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Head First C Safe Cracker -错误:初始化器元素不是编译时常量

Head First C Safe Cracker -错误:初始化器元素不是编译时常量
EN

Stack Overflow用户
提问于 2019-07-24 04:05:35
回答 1查看 325关注 0票数 0

我有以下代码,它直接来自Head First C第5章,我使用Clang 7和GCC 6得到一个错误:

代码语言:javascript
复制
#include <stdio.h>

typedef struct {
    const char* description;
    float value;
} swag;

typedef struct {
    swag* swag;
    const char* sequence;
} combination;

typedef struct {
    combination numbers;
    const char* make;
} safe;

swag gold = {
    "GOLD!",
    1000000.0
};

combination numbers = {
    &gold,
    "6502"
};

safe s = {
    numbers,
    "RAMACON250"
};

int main()
{
    printf("Contents = %s\n", s.numbers.swag->description);
}

下面是错误:

代码语言:javascript
复制
> clang-7 -pthread -lm -o main main.c
main.c:29:5: error: initializer element is not a compile-time
      constant
    numbers,
    ^~~~~~~
1 error generated.

我发现了许多类似的堆栈溢出问题,但似乎没有一个是完全相同的代码场景。下面是代码的REPL:

https://repl.it/repls/TechnologicalCarelessPatterns

EN

回答 1

Stack Overflow用户

发布于 2019-07-24 12:54:40

初始化结构的方式是不正确的。该语法用于初始化C中的数组。以下是经过适当结构初始化的修改后的代码版本。

代码语言:javascript
复制
#include <stdio.h>


typedef struct {
    const char* description;
    float value;
} swag;

typedef struct {
    swag* swag;
    const char* sequence;
} combination;

typedef struct {
    combination numbers;
    const char* make;
} safe;

swag gold;
combination numbers;
safe s;

int main()
{
  gold.description = "GOLD!";
  gold.value = 10000.0;
  numbers.swag = &gold;
  numbers.sequence = "6502";
  s.numbers = numbers;
  s.make = "RAMACON250";
    printf("Contents = %s\n", s.numbers.swag->description);
}

这是有效的,但这不是一个很好的赋值指针变量的方法。对于char *,您需要使用strcpy;对于一般结构指针,您需要使用malloc

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57171440

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档