【问题标题】:Assigning Value to attribute of struct为结构的属性赋值
【发布时间】:2013-08-03 01:17:42
【问题描述】:

我正在尝试将值分配给指向结构的指针的属性,但得到分段错误。

  typedef struct {
    int id;
    char payload[10];
  }packet;

  void main(){
   packet *header;
   header->id = 1;
  }

它可以编译,但是当我运行它时它给了我一个段错误。它仅在我创建标头时使用“malloc”时才有效。这是为什么?通常我不必为其他指针类型分配内存。

【问题讨论】:

  • 请记住,main() 的正确返回类型是 int,而不是 void,尽管您可以在许多书籍中阅读。此外,以下建议使用malloc() 的答案都没有真正麻烦检查malloc() 是否成功。当然,在这个计划的范围内,失败是极不可能的。然而,好的做法仍然是好的做法,不检查malloc() 最终会咬你一口——可能是当你的程序正在向 CEO 演示或已经发布给数千甚至数百万的客户时,解决问题会产生相应的成本.
  • 如果您在一本书中看到void main(),这表明作者不太了解C,您应该找到一本更好的书。 (void main(),或者更好的void main(void),对于嵌入式系统可能是正确的,但如果你正在使用这样的系统,你应该已经知道了。)

标签: c struct segmentation-fault


【解决方案1】:

在这种情况下,header 没有被初始化——它是一个指针,这意味着它没有指向任何有意义的东西。当您尝试为 header->id 分配一个值时,您会得到一个段错误。这是完全合乎逻辑的,只有在为它分配内存时才工作是正确的。

或者,你想创建一个实际的数据包:

packet header;
header.id = 1;

或者你想堆分配一个:

packet* header = malloc(sizeof(packet));
if(header){ //Check if malloc succeeded
    header->id = 1;
}

【讨论】:

    【解决方案2】:

    您可以做以下两件事之一:

    packet *header = (packet*) malloc (sizeof (packet));
    

    packet header;
    header.id = 10;
    

    根据您的用例,一种可能比另一种更适合。如果您要使用malloc,请记得在之后致电free

    【讨论】:

      【解决方案3】:

      当您说“通常我不必为其他指针类型分配内存”时,指针是原始类型(如 int),或者结构已经分配了一些内存(可能来自堆栈)。

      所以这应该在没有 malloc 的情况下工作:

      int main() {
         packet headerOnStack;
         packet *header = &headerOnStack;
         header->id = 1;
      }
      

      但是,由于它在堆栈上,一旦main() 返回,该结构就会消失。通常,这不是问题,因为一旦main() 返回,您的程序就完成了。如果这是另一个功能,那么这将是您必须考虑的一个因素。

      【讨论】:

      • 如果您要发布建议的修复,请将不正确的void main() 更改为正确的int main(void)。 (可以想象,void main() 对于嵌入式系统可能是正确的,但 OP 不太可能与这样的系统一起工作。)
      【解决方案4】:

      这里的错误在于你没有初始化指针,因为它会指向空,试图访问仍然是“空”的指针位置的属性将导致段错误

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-05-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-18
        相关资源
        最近更新 更多