【问题标题】:I am Getting segmentation fault while implementing Stack Data Structure我在实现堆栈数据结构时遇到分段错误
【发布时间】:2020-06-28 02:20:52
【问题描述】:

我在以下代码 sn-p 中遇到分段错误。它是一个代码,应该为交易卡中的各种属性分配值并显示它。我通常在数据结构方面搞砸了,所以如果你们可以推荐一些资源来了解分段错误和类似的东西,这将非常有帮助。

#include<stdio.h>
#include<stdlib.h>

typedef struct cards
{
    int power;
    int energy;
    int heal;
    int karma;

    struct cards *next;
}node;

node *createCards()
{
    node *new_node=(node*)malloc(sizeof(node));

    new_node->energy=500+rand()%400;
    new_node->heal=100+rand()%200;
    new_node->karma=50+rand()%100;
    new_node->power=1000+rand()%501;

    return new_node;

}

void createStack(node *head, int no_cards)
{
    if(head==NULL)
        head=createCards();

    head->next=NULL;

    int i=0;

    while(i<no_cards-1)    
    {
        node *tmp=createCards();
        tmp->next=head;
        head=tmp;

        i++;
    }
}


void displayCards(node *head)
{
    node *crt=head;
    int i=1;

    while(crt->next)
    {
        printf("\n  ------------------------------------- ");
        printf("\n |                <%d>                 |", i);
        printf("\n |                                     |");
        printf("\n |   POWER :   %d                      |", crt->power);
        printf("\n |                                     |");
        printf("\n |                                     |");
        printf("\n |   ENERGY:   %d                      |", crt->energy);
        printf("\n |                                     |");
        printf("\n |                                     |");
        printf("\n |   HEAL  :   %d                      |", crt->heal);
        printf("\n |                                     |");
        printf("\n |                                     |");
        printf("\n |   KARMA :    %d                     |", crt->karma);
        printf("\n |                                     |");
        printf("\n  -------------------------------------");

        i++;
        crt=crt->next;
    }
}

node *player1=NULL;
int main()
{
    createStack(player1, 10);

    displayCards(player1);
}

【问题讨论】:

  • player1 变量永远不会被分配分配的内存,因为您将player1 的副本传递给createStack,并且此函数将指针分配给局部变量,因此一旦函数丢失,它就会丢失返回。 player1 仍然是 NULL 因此是段错误。
  • 要从createStack修改player1,您需要传递其地址,或者更改createStack以返回新的头部并将其分配给调用者中的player1。跨度>
  • 非常感谢你们的意见。双 de 引用变量 head(即被传递的 player1)产生了所有的不同,因为函数得到了一个真正的参数来处理而不是一个副本。

标签: c segmentation-fault stack


【解决方案1】:

我怀疑你想像这样写createStack() 函数

void createStack (node *head, int no_cards) {
    if (head == NULL) {
        head = createCards();
    }

    int i = 0;
    node *tmp = head;

    while(i < no_cards) {
        tmp->next = createCards();
        tmp = tmp->next;
        i++;
    }
}

我注意到您正在创建一个链表而不是堆栈。 并删除函数displayCards() 中while 循环底部的行crt-&gt;next。 谢谢你的提问:)

附:如果您有任何其他疑问,请发表评论。我将编辑我的答案来回答这个问题。

【讨论】:

  • 非常感谢您的建议。函数中的双重取消引用解决了这个问题,因为函数得到了实际参数而不是传递函数的副本。
猜你喜欢
  • 2018-06-02
  • 2021-12-03
  • 1970-01-01
  • 2021-01-17
  • 2020-06-03
  • 2015-02-14
  • 2021-10-01
  • 2013-10-05
  • 1970-01-01
相关资源
最近更新 更多