总线错误:C处理struct指针的10

时间:2013-04-16 03:59:09

标签: c list pointers struct

我正在使用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;
}

3 个答案:

答案 0 :(得分:2)

我怀疑head函数中的tailmain节点未正确初始化。

如果headNULL,则head似乎会为其分配一个新节点。但是,您对NULL的定义并不能确保它最初是tailif (head == NULL)也不是)。所以你可以绕过gdb分支(确保它们真的是从Bus error执行:)请。)。

tail很少见。所以我用Google搜索,从here

时可能会发生总线错误
  

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

这可能是因为else未对齐且代码直接运行到push(tail, newEntry);分支。所以 {{1}}将访问未对齐的尾部(这也验证了我的嫌疑人)。

答案 1 :(得分:1)

修正#3:while ((scanf("%d:%d", &timeHour, &timeMin)) != EOF)在此循环的主体内,无法保证分配了两个整数timeHourtimeMin。也许你的意思是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 **,但newEntrystruct 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);

因为你现在“尾巴”永远不会改变,因为你没有将变量的地址传递给函数,所以你不能改变它指向的东西。

还要确保初始化所有局部变量(标题,尾部,...),使其习惯