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

C语言开发shell实现多管道时无法正确获取token数组长度

问题根因

你当前的核心错误是误用sizeof计算动态字符串数组长度:

  • args是char**类型的指针,不是静态数组,sizeof(args)获取的是指针本身的内存占用:32位编译环境下为4字节,64位环境下为8字节
  • args[0]是char*类型的指针,内存占用和args一致,两者相除结果固定为1,你观测到的8是偶发的异常输出,本质都是该计算逻辑完全失效。
解决方案

C语言中处理动态分配的字符串数组,通用惯例是在数组末尾追加一个NULL指针作为结束标记,不需要额外传长度参数:

  1. 先确认my_getline的实现符合该约定:给返回的args数组分配内存时多开1个元素的空间,最后一个元素手动赋值为NULL
  2. 替换你当前的长度计算逻辑,用遍历到NULL停止的方式统计长度:
int calc_args_size(char **args) {
    int size = 0;
    while (args && args[size] != NULL) {
        size++;
    }
    return size;
}

你在main函数中调用该函数即可获得准确的token数组长度。

额外注意点

你当前代码还有两个不影响当前问题但需要修正的细节:

  • 重复声明void free(void *ptr);无意义,stdlib.h已经包含该声明
  • 信号处理函数中单独调用wait会导致同时退出多个子进程时出现僵尸进程,建议替换为循环调用waitpid(-1, &status, WNOHANG)处理所有退出的子进程

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 22:15:05