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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 04:57:02