我正在使用C中的List示例,其中新节点被推送到堆栈的末尾。当我尝试将新节点推送到最后时,我不断获得Bus Error: 10
。这是我的推送功能:
void push(struct node *tail, struct node *newNode) {
tail->next = newNode; // gdb says the problem is here
tail = tail->next;
}
我用push(tail, newNode);
如果有必要,这里也是我的结构:
struct node
{
int hour;
int minute;
char *name;
struct node *next;
};
这是显示导致push()
int main()
{
char inputString[50];
int timeHour, timeMin;
struct node *head;
struct node *tail;
while ((scanf("%d:%d", &timeHour, &timeMin)) != EOF) {
scanf("%s", inputString);
if (strcmp(inputString, "enqueue") == 0) {
if (head == NULL) {
head = malloc(sizeof(struct node));
head->hour = timeHour;
head->minute = timeMin;
// get name
scanf("%s", inputString);
head->name = malloc(strlen(inputString)+1);
strcpy(head->name, inputString);
tail = head;
printEnqueue(head);
} else {
struct node *newEntry = malloc(sizeof(struct node));
newEntry->hour = timeHour;
newEntry->minute = timeMin;
// get name
scanf("%s", inputString);
newEntry->name = malloc(strlen(inputString)+1);
strcpy(newEntry->name, inputString);
push(tail, newEntry);
printEnqueue(newEntry);
}
} else {
pop(&head, timeHour, timeMin);
}
}
return 0;
}
答案 0 :(得分:2)
我怀疑head
函数中的tail
和main
节点未正确初始化。
如果head
为NULL
,则head
似乎会为其分配一个新节点。但是,您对NULL
的定义并不能确保它最初是tail
(if (head == NULL)
也不是)。所以你可以绕过gdb
分支(确保它们真的是从Bus error
执行:)请。)。
tail
很少见。所以我用Google搜索,从here,
使用处理器指令,其地址不满足其对齐要求。
这可能是因为else
未对齐且代码直接运行到push(tail, newEntry);
分支。所以
{{1}}将访问未对齐的尾部(这也验证了我的嫌疑人)。
答案 1 :(得分:1)
修正#3:while ((scanf("%d:%d", &timeHour, &timeMin)) != EOF)
在此循环的主体内,无法保证分配了两个整数timeHour
和timeMin
。也许你的意思是while ((scanf("%d:%d", &timeHour, &timeMin)) == 2)
。
修正案#2:当您将值传递给函数时,您传递值,而不是变量。调用者(您的tail
)无法看到您在push
内对main
所做的分配。您需要传入一个指向该变量的指针(例如&head
,这是一个struct node **
)并按原样分配给*tail
。或者,您可以return newNode;
push
使用返回值作为新的head
。
修正案:这甚至看起来都不会编译。我们来看看push
。
void push(struct node **tail, struct node *newNode) {
(*tail)->next = *newNode; // gdb says the problem is here
*tail = (*tail)->next;
}
*newNode
的类型是什么? struct node
。
(*tail)->next
的类型是什么?这就是这个片段:
struct node
{
int hour;
int minute;
char *name;
struct node *next;
};
修复您的不一致性,并在发布之前确保您的最小,可编辑的测试用例可编辑。
不要忘记检查scanf
的返回值!在您的情况下,除非发生错误,否则应返回1.
head->name = malloc(strlen(inputString));
strcpy(head->name, inputString);
这是错误的,因为你没有分配足够的空间来存储'\0'
字符。我想你的意思是malloc(strlen(inputString) + 1)
。您的代码中存在两个此错误的实例。我不打算重复自己。
struct node *newEntry = malloc(sizeof(struct node));
push(&tail, newEntry);
newEntry
的类型是什么? struct node *
。
void push(struct node **tail, struct node **newNode)
newNode
的类型是什么? struct node **
。你看到不一致吗?您需要传递struct node **
,但newEntry
是struct node *
。
答案 2 :(得分:1)
变化
void push(struct node *tail, struct node *newNode)
{
tail->next = newNode; // gdb says the problem is here
tail = tail->next;
}
到
void push(struct node **tail, struct node *newNode)
{
(*tail)->next = newNode; // gdb says the problem is here
(*tail) = (*tail)->next;
}
然后将其称为
push(&tail, newEntry);
因为你现在“尾巴”永远不会改变,因为你没有将变量的地址传递给函数,所以你不能改变它指向的东西。
还要确保初始化所有局部变量(标题,尾部,...),使其习惯。