我正在尝试为指向结构的指针的属性赋值,但得到分段错误。
typedef struct {
int id;
char payload[10];
}packet;
void main(){
packet *header;
header->id = 1;
}
它编译但是当我运行它时它给了我一个段错误。它仅在我创建标头时使用“malloc”时才有效。这是为什么?通常我不必为其他指针类型分配内存。
我正在尝试为指向结构的指针的属性赋值,但得到分段错误。
typedef struct {
int id;
char payload[10];
}packet;
void main(){
packet *header;
header->id = 1;
}
它编译但是当我运行它时它给了我一个段错误。它仅在我创建标头时使用“malloc”时才有效。这是为什么?通常我不必为其他指针类型分配内存。
在这种情况下,标头没有被初始化——它是一个指针,这意味着它没有指向任何有意义的东西。当您尝试为 header->id 分配一个值时,您会得到一个段错误。这是完全合乎逻辑的,只有在你为它分配内存时才工作是正确的。
要么,您想创建一个实际的数据包:
packet header;
header.id = 1;
或者你想堆分配一个:
packet* header = malloc(sizeof(packet));
if(header){ //Check if malloc succeeded
header->id = 1;
}
当您说“通常我不必为其他指针类型分配内存”时,指针是原始类型(如 int),或者结构已经分配了一些内存(可能来自堆栈)。
所以这应该在没有malloc的情况下工作:
int main() {
packet headerOnStack;
packet *header = &headerOnStack;
header->id = 1;
}
但是,因为它在堆栈上,所以一旦main()
返回,结构就会消失。通常,这不是问题,因为一旦main()
返回,您的程序就完成了。如果这是另一个功能,那么这将是您必须考虑的一个因素。
您可以执行以下两项操作之一:
packet *header = (packet*) malloc (sizeof (packet));
或者
packet header;
header.id = 10;
根据您的用例,一个可能比另一个更合适。如果你要使用malloc
,记得之后打电话free
。
这里的错误在于您没有初始化指针,因此,指针指向任何内容,尝试访问仍然为“无”的指针位置的属性将导致段错误