【问题标题】:Segmentation Fault (Core Dumped) - Pointers分段错误(核心转储) - 指针
【发布时间】:2021-05-04 17:32:21
【问题描述】:

我正在开发一个应用程序项目,以找出在德州扑克游戏中获胜的概率。

我的程序有以下 3 种数据类型。

typedef enum {
  SPADES,
  HEARTS,
  DIAMONDS,
  CLUBS,
  NUM_SUITS
} suit_t;

struct card_tag {
  unsigned value;
  suit_t suit;
};

typedef struct card_tag card_t;

struct deck_tag {
      card_t ** cards;
        size_t n_cards;
};
typedef struct deck_tag deck_t;

我写了一个函数void shuffle(deck_t * d) 导致分段错误:

void shuffle(deck_t * d){
    for (size_t i = d->n_cards-1; i >= 0; i--) {
        size_t randNum = random() % n_cards;
        card_t *temp = (d->cards+i);
        (d->cards+i) = (d->cards+randNum);
        (d->cards+randNum) = temp;      
    }
}

我的程序正在编译。但是在测试时,在洗牌的时候,它说:

Segmentation Fault (Core Dumped)

【问题讨论】:

  • 随机产生的数字范围是多少?请显示您如何为卡片分配空间的代码。
  • 你有一个核心转储。你应该分析一下。
  • 我尝试分析它,但我不知道出了什么问题。

标签: c pointers segmentation-fault


【解决方案1】:

它失败是因为变量randNum 可能大于n_cards - 1,这意味着它试图读取不属于程序的内存(更准确地说,不属于d->cards 的内存) .所以你需要做的是确保:

randNum < n_cards-1

一种方法是:

size_t randNum = random() % (n_cards);

这样,声明 randNum &lt; n_cards-1 将始终为 true

【讨论】:

  • 对不起,这是我的错。我写了 randNum=random()%n_cards;只要。但是分段错误仍然存​​在。
  • @NityaPatel 请提供A Minimal, Complete, and Verifiable Example (MCVE)。我怀疑你的问题出在你没有显示的代码中(特别是cards的分配。建议card_t cards[4][13];,因为卡的数量是固定的——不需要动态分配,或者至少card_t (*cards)[13];所以你得到单一分配/免费。
猜你喜欢
  • 2015-05-12
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 2016-09-07
  • 1970-01-01
  • 2020-04-06
  • 1970-01-01
  • 2018-01-05
相关资源
最近更新 更多