链表头节点异常变更求助:任务控制器命令存储链表失效
问题修复方案
核心问题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; }
测试验证
修复后执行流程:
- 输入
ls→ 提示添加任务,链表存入ls - 输入
cat program.c→ 提示添加任务,链表存入cat program.c - 输入
list→ 仅打印现有任务,不会插入list,输出符合预期:
Task 1: ls Task 2: cat program.c
内容的提问来源于stack exchange,提问作者Mitchuous
相关产品推荐
相关产品推荐

