我正在尝试编写一个程序,找到表达式中的所有")"
并将它们放在链表中,始终在列表的开头添加。问题是当我尝试将新元素放入列表时,程序停止工作。
使用示例用户输入865)987
:
#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++;
}
}
我做错了什么?
答案 0 :(得分:4)
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
!
注意:
input
to scanf
suffices;无需&input
。您的scanf
容易受到缓冲区溢出的影响。使用
scanf("%s29", input);
代替。另请阅读this。
答案 1 :(得分:0)
您需要为new_a
分配内存:
new_a = malloc(sizeof(ELEMENT));
答案 2 :(得分:0)
如前所述,正确的代码是:
#include <stdio.h>
#include <stdlib.h>
typedef struct element {
char data;
struct element *next;
} ELEMENT;
int main(void)
{
ELEMENT *first = NULL;
char input[30];
int x=0;
printf("Input expression: ");
scanf("%s", &input);
while(input[x]!='\0'){
if (input[x]==')'){
ELEMENT *new_a = (ELEMENT*)malloc(sizeof(ELEMENT));
printf("%c", input[x]);
new_a->data = input[x];
new_a->next = first;
first = new_a;
}
x++;
}
}