You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

函数中持续出现类型不兼容错误求助:struct card与struct card*赋值问题

嘿,这个类型不兼容的问题其实很好解决,我帮你拆解一下~

首先看报错的那一行:temp = dealerDeck[i];,咱们先理清楚两边的类型:

  • 你声明的temp是struct card,这是一个具体的卡片结构体实例(值类型);
  • 而dealerDeck是struct card**类型,所以dealerDeck[i]其实是struct card*——一个指向卡片结构体的指针。

把指针直接赋值给结构体实例,编译器当然会报错啦,这俩根本不是一个类型的东西。

接下来还要看看你的代码逻辑是不是和预期一致:你给dealerDeck分配了size*sizeof(struct card*)*4的内存,然后循环里又给每个dealerDeck[i]分配size*sizeof(struct card),看起来是想搞一个二维的卡片结构体数组?但你的洗牌逻辑却是交换dealerDeck[i]和dealerDeck[j]这两个指针,这取决于你到底想实现什么:

情况1:想通过指针数组洗牌(不需要复制卡片结构体,只交换指针指向)

这种情况适合不想额外复制内存,只是重新排列原deck元素的引用。那你需要把temp改成指针类型:

struct card** shuffleDeck(struct card deck[], int size) {
    int i, j;
    struct card* temp; // 改成指针类型,和dealerDeck[i]匹配
    struct card** dealerDeck;
    // 这里假设你要创建包含4*size个卡片指针的数组(4副牌的量)
    dealerDeck = malloc(4 * size * sizeof(struct card*));
    if (!dealerDeck) { // 记得加内存分配失败的判断哦
        return NULL;
    }
    // 先初始化每个指针指向原deck的元素(循环复用原deck的卡片)
    for (i = 0; i < 4 * size; i++) {
        dealerDeck[i] = &deck[i % size];
    }
    // 用Fisher-Yates洗牌算法(比你原来的写法更公平高效)
    for (i = 4 * size - 1; i > 0; i--) {
        j = rand() % (i + 1);
        // 交换指针
        temp = dealerDeck[i];
        dealerDeck[i] = dealerDeck[j];
        dealerDeck[j] = temp;
    }
    return dealerDeck;
}

情况2:想创建独立的二维卡片数组,复制原deck内容后洗牌

如果你需要每一组都是独立的卡片副本,那就要操作结构体元素本身,而不是指针:

struct card** shuffleDeck(struct card deck[], int size) {
    int i, j, k;
    struct card temp; // 这里用值类型,用来交换结构体元素
    struct card** dealerDeck;
    // 分配4组卡片数组的指针
    dealerDeck = malloc(4 * sizeof(struct card*));
    if (!dealerDeck) {
        return NULL;
    }
    for (i = 0; i < 4; i++) {
        // 每组分配size个卡片结构体的内存
        dealerDeck[i] = malloc(size * sizeof(struct card));
        if (!dealerDeck[i]) {
            // 内存分配失败要记得释放已分配的内存,避免泄漏
            for (int m = 0; m < i; m++) {
                free(dealerDeck[m]);
            }
            free(dealerDeck);
            return NULL;
        }
        // 把原deck的内容复制到当前组
        for (k = 0; k < size; k++) {
            dealerDeck[i][k] = deck[k];
        }
        // 对当前组的卡片进行洗牌(交换结构体元素)
        for (k = size - 1; k > 0; k--) {
            j = rand() % (k + 1);
            temp = dealerDeck[i][k];
            dealerDeck[i][k] = dealerDeck[i][j];
            dealerDeck[i][j] = temp;
        }
    }
    return dealerDeck;
}

核心就是一句话:让temp的类型和你要交换的元素类型完全匹配,要么都是指针,要么都是结构体实例。另外记得加内存分配失败的判断,避免内存泄漏哦~

内容的提问来源于stack exchange,提问作者Camkin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:29:29