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

===============>>#1 票数:2 已采纳

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

从你的代码看,如果headNULL ,那么head将被分配一个新节点。 但是,你对head的定义并不能确保它最初为NULLtail也不是)。 所以你可以绕过if (head == NULL)分支(确保它们确实是从gdb执行的,请:))。

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

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

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

===============>>#2 票数:1

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


修正#2:当您将值传递给函数时,您传递的是 ,而不是变量。 调用者(您的main )无法看到您在push进行tail的任务。 你需要传入一个指向该变量的指针(例如。 &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的类型是newEntry struct node *

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

newNode的类型是什么? struct node ** 你看到不一致吗? 您需要传入struct node ** ,但newEntry是一个struct node *

===============>>#3 票数: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'永远不会改变,因为你没有将变量的地址传递给函数,因此你无法改变它所指向的内容。

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

  ask by Slayter translate from so

未解决问题?本站智能推荐:

5回复

C中的struct的双指针是什么意思

我在理解此结构时遇到问题,希望获得明确的解释。 父母和孩子是什么意思? “父级”是此结构的数组吗? 孩子们的意思是什么? 这是一个数组数组吗? 我真的听不懂 最后一件事,如果我添加一个element,它成为某个父级的特定子级,我如何才能到达父级的所有子级? 它不应该是结构
5回复

在C [duplicate]中使用typedef时使用指向struct的指针

这个问题在这里已有答案: 输入deff指针是个好主意吗? 14个答案 为了在C中定义新的数据类型,例如链表的类型 可以使用以下定义之一 从我所看到的,通常的做法是第一个定义。 问题是第二个定义是否也是可接受的做法。 在哪种情况下,如果有人应该比
2回复

使用指针访问struct内部的struct

我有2个结构相互关联。 这些形成了一个链表。 我正在构建一个查找函数来比较Item结构。 更具体地说,我可以在if语句上执行list-> item-> text ,还是必须执行(* list)。(* item).text ? 或者这根本不可能?
1回复

struct上的指针无法复制到函数内的另一个指针[duplicate]

这个问题在这里已有答案: 传递地址,但它的工作方式类似于C中的值呼叫? 3个答案 我有一个问题,这听起来真的很愚蠢,但我只是不明白。 我尝试使用以下Struct编写一个小shell来获取列表: 我用main方法启动了两个指针 然后我为第一个元素分
1回复

在结构指针中需要一些澄清

我对以下代码有疑问, 我的功能如下 所以这两行之间有什么区别,对我来说看起来是一样的。错误是, 谢谢 :)
3回复

结构列表中的内存错误(未知的存储)

我正在尝试编译此代码,但出现内存错误:list1.c:25:15:错误:“ cnodo”的存储大小未知struct nobo cnodo; 所以有人可以告诉我此错误的根源是什么以及如何避免它?
3回复

在C中构造指针链接列表

如果我在主目录中初始化列表,它的作用就像魅力,但我不能添加到空列表中。 为什么不?
2回复

如何使用字符串指针访问其余字符串?

我正在尝试将文件中的唯一字符串写入链接列表,并为每个重复的单词增加计数。 我想使用getNextWord函数,该函数返回一个指向文件中下一个单词的指针。 问题是我对c和指针非常陌生,因此我实际上不知道在我的调用getNextWord的主要方法中该做什么,以及如何使用此字符串指针实际访问它所指
1回复

C链表:头在变化

我使用结构作为链表,但是由于最近的更改(我忘了检查git repo,所以我不记得哪个更改)head元素中的一个struct变量正在改变。 在执行下面显示的代码时,post-> filename得到了一个有效的字符串,但是在离开方法之后,head_post-> filename( 应
4回复

C中的简单结构程序

我是编程的新手,所以请耐心等待。 任何人都可以解释最后一行代码正在做什么以及整个代码块试图做什么。 我知道第一个块正在创建一个名为node的结构,并添加两个指针* next和* prev。 顺便说一下,这是链表计划的一部分 先感谢您。