我试图编写一个程序,在一个表达式中找到所有的")",并将它们放在一个链接列表中,总是在列表的开头添加。问题是,当我试图将新元素放入列表时,程序将停止工作。
使用示例用户输入:

#include <stdio.h>
#include <stdlib.h>

typedef struct element {
    char data;
    struct element *next;
} ELEMENT;


int main(void)
{
   ELEMENT *first = NULL;
   ELEMENT *new_a;

   char input[30];
   int x=0;

   printf("Input expression: ");
   scanf("%s", &input);

   while(input[x]!='\0'){
       if (input[x]==')'){
           printf("%c", input[x]);        //This works just fine.
           new_a->data = input[x];        //Here, the program stops working.
           new_a->next = first;
           first = new_a;
       }
       x++;
    }
}

我做错什么了?

最佳答案

new_a->data

相当于
(*new_a).data

如您所见,new_a试图被取消引用。问题是new_a是未初始化的,因此任何后续尝试解除对它的引用都是未定义的行为(以分段错误的形式)。
为了解决这个问题,您需要为new_a分配内存:
在堆栈上分配空间。只有当链接列表在main中专用时,这才起作用,因为局部变量的作用域only embraces the beginning and end of a function
这样做:
ELEMENT new_a;

...

new_a.data = input[x];
new_a.next = first;
first = &new_a;

使用malloc。这通常用于链表,并且适用于存在直到程序终止的链表,因为它与范围无关:
ELEMENT* new_a = malloc(sizeof(ELEMENT));

以后别忘了free
笔记:
Passing input to scanf suffices;不需要&input
您的scanf易受缓冲区溢出攻击。使用
scanf("%s29", input);

相反。同时阅读this

10-01 05:44
查看更多