【问题标题】:defining struct members prior to runtime in C在 C 中运行前定义结构成员
【发布时间】:2017-07-13 12:38:08
【问题描述】:

我有一个问题,为什么我们不能在 C 中运行之前定义结构的成员。我有以下结构设置并准备好了:

struct GSM{

    char* status;
    char* make;
    char* accept;
    char* connect;
    char* exit;

};

struct GSM GSM_comms = NULL;

现在我知道我不能在 main() 之外定义这个结构的成员。但是我真的很想知道为什么。

是不是因为struct需要在栈上分配,并指向堆上的变量数据?

编辑:

例如,我不能这样做:

struct GSM{ 
    char* status;
    char* outbound;
    char* inbound;
    char* exit;
};

struct GSM GSM_comms;

GSM_comms.status = &variable;

int main(){

}

【问题讨论】:

  • 现在我知道我不能在 main() 之外定义这个结构的成员,这根本不是真的,并且缺乏上下文来了解你的真正意思。
  • I cannot define members of this struct outside of main()....等等...什么?你刚刚做了什么?
  • 我认为您要查找的词是 initialize。只要你说struct x { ... };,成员就会定义
  • 这个问题不清楚。请澄清你的意思?。
  • @JonathonReinhart 你可以初始化。你不能使用作业

标签: c struct memory-management heap-memory stack-memory


【解决方案1】:

您用于初始化结构的语法无效。您正在尝试将 NULL(它是一个指针)分配给您的结构的实例(而不是指向)。

要初始化struct,您需要为结构体中的每个值提供值,用花括号括起来:

struct GSM GSM_comms = { NULL, NULL, NULL, NULL, NULL };

编辑:

您可以在函数之外执行此操作的原因:

GSM_comms.status = &variable;

是因为这是一个赋值,而不是初始化。只有定义(带有可选的初始化程序)可以出现在函数之外。你需要这样做:

struct GSM GSM_comms = { &variable, NULL, NULL, NULL, NULL };

【讨论】:

  • 是的,NULL 赋值只是避免悬空指针的习惯。啊,好吧..我实际上并没有尝试在那里分配,但是这个符号仍然非常有用。谢谢!
  • @MedicineMan25 很高兴我能帮上忙。如果您觉得有用,请随时 accept this answer
  • 回复:编辑。好的太棒了。我需要更清楚地了解那里的差异。我假设分配和初始化的规则是不同的。会做更多的学习。再次感谢!
猜你喜欢
  • 2013-12-14
  • 1970-01-01
  • 2011-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-04
相关资源
最近更新 更多