函数中持续出现类型不兼容错误求助: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
相关产品推荐
相关产品推荐

