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