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

链表头节点异常变更求助:任务控制器命令存储链表失效

问题修复方案

核心问题1:语法错误导致list被误插入链表

你的代码中if(strcmp("list", cmdline)==0)块的括号配对完全错误:while循环后直接跟else属于语法错误(while语句不能搭配else),导致else块(添加任务的逻辑)会在遍历完链表后无条件执行——也就是说,输入list时,不仅会打印现有任务,还会把list本身插入链表,这就是输出中出现list的直接原因。

核心问题2:任务命令的指针指向风险

createTask函数中直接将传入的指针赋值给newNode->cmd,如果传入的是栈上的数组(比如cmdline),后续循环会覆盖该数组内容,导致旧任务的命令被新输入覆盖。虽然你在main中用malloc给cmd分配了堆内存,但为了避免意外,建议在createTask中独立分配内存存储命令字符串。


修复后的关键代码片段

1. 修正main中的条件判断括号

// MY CODE
if(strcmp("list", cmdline) == 0) {
    node_t *current = head;
    while(current != NULL) {
        printf("Task %d: %s\n", current->data->taskNumber, current->data->cmd);
        current = current->next;
    }
} else { // 现在else与if正确配对,仅非list命令才执行添加逻辑
    log_kitc_task_init(size + 1, cmd);
    taskNode_t *newNode = createTask(cmd, size + 1);
    if(head != NULL) {
        printf("head: %s\n", head->data->cmd);
    }
    head = insertFirst(head, newNode);
}

2. 加固createTask的字符串存储逻辑

taskNode_t *createTask(char *cmdline, int size) {
    taskNode_t *newNode = (taskNode_t*)malloc(sizeof(taskNode_t));
    newNode->pid = 0;
    newNode->taskNumber = size;
    // 独立分配内存并复制字符串,避免原指针指向的内容被覆盖
    newNode->cmd = malloc(strlen(cmdline) + 1);
    strcpy(newNode->cmd, cmdline);
    newNode->status = LOG_STATE_READY;
    newNode->exit_code = 0;
    return newNode;
}

测试验证

修复后执行流程:

  1. 输入ls → 提示添加任务,链表存入ls
  2. 输入cat program.c → 提示添加任务,链表存入cat program.c
  3. 输入list → 仅打印现有任务,不会插入list,输出符合预期:
Task 1: ls
Task 2: cat program.c

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 20:25:27