在C linux中,scanf获取给出seg错误的struct元素的值

在C linux中,scanf获取给出seg错误的struct元素的值,c,linux,structure,C,Linux,Structure,我的scanf声明是seg的错。你能告诉我为什么吗 typedef struct message1 { int call_id1; int lac; long int attribute; int conn_id; struct message1 *next1; }M1; M1 *last=NULL; main() { printf("\nEnter Call Id\t"); scanf("%d",&last->call_id

我的scanf声明是seg的错。你能告诉我为什么吗

typedef struct message1
{
    int call_id1;
    int lac;
    long int attribute;
    int conn_id;
    struct message1 *next1;
}M1;
M1 *last=NULL;
main()
{
    printf("\nEnter Call Id\t");
    scanf("%d",&last->call_id1);
}

显然。。。未将其初始化为正确的值:

M1 *last=NULL;
应该是

M1 *last= (M1*)malloc(sizeof(M1));

显然。。。未将其初始化为正确的值:

M1 *last=NULL;
应该是

M1 *last= (M1*)malloc(sizeof(M1));

您尚未为struct
M1
分配内存,并试图访问其内存内容,这是分段错误的原因


动态分配内存为,
M1*last=malloc(sizeof(M1))

您尚未为struct
M1
分配内存,并试图访问其内存内容,这是分段错误的原因


动态分配内存为,
M1*last=malloc(sizeof(M1))

您试图读取未分配内存的结构

M1*last=malloc(sizeof(struct message1));//在全球空间

last=malloc(sizeof(struct message1));//主要功能


您正在尝试读取未分配内存的结构

M1*last=malloc(sizeof(struct message1));//在全球空间

last=malloc(sizeof(struct message1));//主要功能


因为您用NULL初始化了结构指针

M1 last; 
够了

不需要给出任何指针。如果希望将其作为指针,则使用malloc

M1 *last;
last = malloc(sizeof(M1));

因为您用NULL初始化了结构指针

M1 last; 
够了

不需要给出任何指针。如果希望将其作为指针,则使用malloc

M1 *last;
last = malloc(sizeof(M1));

实际区域不安全。@BLUEPIXY您能解释一下您的答案并告诉我上述问题的替代方案吗?您认为这是什么
(NULL)->call_id1
@Arjun Sreedharan
&
不是用于
last
,而是用于
last->call_id1
需要
&
的地方。小调:考虑到答案中分配内存的各种风格,建议使用
M1*last=malloc(sizeof*last)的风格最容易编写、维护和理解。实际区域不安全。@BLUEPIXY您能解释一下您的答案并告诉我上述问题的替代方案吗?您认为这是什么
(NULL)->call_id1
@Arjun Sreedharan
&
不是用于
last
,而是用于
last->call_id1
需要
&
的地方。小调:考虑到答案中分配内存的各种风格,建议使用
M1*last=malloc(sizeof*last)的风格最容易编写、维护和理解。耶!!thanx。。这就是问题所在。是的!!thanx。。这就是问题所在。您也需要
&
。创建结构时,成员将有自己的地址,您希望读入该地址,而不是解释为成员指向的地址的随机值!对不起,但是
scanf(“%d”,&last->call\u id1)正确。@fritzone是。谢谢编辑您也需要
。创建结构时,成员将有自己的地址,您希望读入该地址,而不是解释为成员指向的地址的随机值!对不起,但是
scanf(“%d”,&last->call\u id1)正确。@fritzone是。谢谢编辑