这可能是C编程语言中最简单的问题之一......
我有以下代码:
typedef struct node
{
int data;
struct node * after;
struct node * before;
}node;
struct node head = {10,&head,&head};
有没有一种方法可以让我的头部成为头部[使它成为一个指针]并且仍然可以使用'{}'[{10,& head,& head}]来声明一个实例还是把它留在全球范围内?
例如:
//not legal!!!
struct node *head = {10,&head,&head};
答案 0 :(得分:7)
解决方案1:
#include <stdlib.h>
#include <stdio.h>
typedef struct node
{
int data;
struct node * after;
struct node * before;
}node;
int main() {
struct node* head = (struct node *)malloc(sizeof(struct node)); //allocate memory
*head = (struct node){10,head,head}; //cast to struct node
printf("%d", head->data);
}
像struct node *head = {10, head, head}
这样简单的东西不会起作用,因为你没有为结构分配内存(int和两个指针)。
解决方案2:
#include <stdlib.h>
#include <stdio.h>
typedef struct node
{
int data;
struct node * after;
struct node * before;
}node;
int main() {
struct node* head = &(struct node){10,head,head};
printf("%d", head->data);
}
这将超出范围 - 解决方案1因此而优越,因为您正在创建链接列表,我相信您需要堆分配内存 - 而不是堆栈分配。
答案 1 :(得分:0)
你可以让头部成为指针,但你需要在函数中初始化它。
struct node head_node;
struct node *head = &head_node;
void
initialize() {
*head = {10,&head_node,&head_node};
}
你无法直接在全局范围内初始化head ptr。