C语言洗牌分割函数访问CardDeck成员报非结构/联合错误如何解决
编译错误修复方案
报错根本原因
两次报错都是因为结构体成员访问符和变量类型不匹配:
- 第一次报错:
leftDeck和rightDeck是CardDeck*指针类型,你用了仅适用于值类型的.操作符访问成员,编译器识别为非结构体/联合体类型,因此报错。 - 第二次报错:你把所有访问符都改成了
->,但origDeck是CardDeck值类型,->仅适用于指针类型,因此编译器提示参数类型无效。
正确的访问规则:
- 结构体值类型访问成员用
. - 结构体指针类型访问成员用
->
完整修复代码
除了访问符的问题,你的代码还存在其他逻辑错误,统一修复后如下:
void divide(CardDeck origDeck, CardDeck * leftDeck, CardDeck * rightDeck) { // 循环边界变量改名避免和牌堆size歧义 int cutTimes = origDeck.size - 1; // 原代码错误:循环增量写为size++会导致死循环,改为i++ for (int i = 0; i < cutTimes; i++) { int midpoint = i + 1; int j = 0; int k = 0; while (j < midpoint) { // 指针用->,值类型用. leftDeck->cards[j] = origDeck.cards[j]; j++; } // 补充左牌堆size赋值 leftDeck->size = midpoint; int remaining = origDeck.size - j; while (k < remaining) { rightDeck->cards[k] = origDeck.cards[j]; k++; j++; } // 补充右牌堆size赋值 rightDeck->size = remaining; // 原代码是函数声明,改为实际调用,传入解引用后的结构体值 interleave(*leftDeck, *rightDeck); } }
其他需修正的逻辑问题
- 原for循环的增量错误写为
size++,会导致循环条件永远成立,进入死循环 - 原代码在循环内仅重复声明
interleave函数,没有实际执行调用,无法完成后续的交错排列逻辑 - 缺少对左右牌堆
size成员的赋值,后续使用这两个牌堆时会因大小异常产生运行时错误
内容的提问来源于stack exchange,提问作者aerialace8
相关产品推荐
相关产品推荐

