1

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

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

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

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

4

4 回答 4

3

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

要么,您想创建一个实际的数据包:

packet header;
header.id = 1;

或者你想堆分配一个:

packet* header = malloc(sizeof(packet));
if(header){ //Check if malloc succeeded
    header->id = 1;
}
于 2013-08-01T22:15:18.563 回答
1

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

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

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

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

于 2013-08-01T22:19:20.987 回答
1

您可以执行以下两项操作之一:

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

或者

packet header;
header.id = 10;

根据您的用例,一个可能比另一个更合适。如果你要使用malloc,记得之后打电话free

于 2013-08-01T22:17:56.677 回答
0

这里的错误在于您没有初始化指针,因此,指针指向任何内容,尝试访问仍然为“无”的指针位置的属性将导致段错误

于 2013-08-01T22:20:12.997 回答