1

我正在处理 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;
}
4

3 回答 3

2

我怀疑函数中的headandtail节点没有正确初始化。main

从您的代码看来,head如果是NULL. 但是,您的定义head并不能确保它最初是NULL(也不是tail)。所以你可以绕过if (head == NULL)分支(确保它们真的是从gdb请执行的:))。

Bus error很少见。所以我用谷歌搜索了它,从这里开始,可能会发生总线错误

使用地址不满足对齐要求的处理器指令。

这可能是因为tail没有对齐并且代码直接运行到else分支中。因此 push(tail, newEntry);将访问未对齐的尾部(这也验证了我的怀疑)。

于 2013-04-16T05:57:23.603 回答
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);

正如您目前拥有的那样,“tail”永远不会改变,因为您没有将变量的地址传递给函数,因此您无法更改它指向的内容。

还要确保你初始化了所有的局部变量(header,tail,...),让它成为一个习惯

于 2013-04-16T06:07:44.687 回答
1

修正#3:while ((scanf("%d:%d", &timeHour, &timeMin)) != EOF)在这个循环的主体内,不能保证两个整数timeHourtimeMin被分配到。也许你的意思是while ((scanf("%d:%d", &timeHour, &timeMin)) == 2)


修正#2:当你将一个值传递给一个函数时,你传递的是value,而不是变量。调用者(您的)看tail不到您在其中所做的分配。您需要传递一个指向该变量的指针(例如,它是 a )并像以前一样分配给。或者,您可以从您的并使用返回值作为您的新.pushmain&headstruct node ***tailreturn newNode;pushhead


修正:这甚至看起来都不会编译。让我们来看看push

void push(struct node **tail, struct node *newNode) {
    (*tail)->next = *newNode; // gdb says the problem is here
    *tail = (*tail)->next;
}

是什么类型的*newNodestruct 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);

是什么类型的newEntrystruct node *.

        void push(struct node **tail, struct node **newNode)

是什么类型的newNodestruct node **. 你看到不一致了吗?你需要传入 a struct node **,但是newEntry是 a struct node *

于 2013-04-16T04:17:03.383 回答