C语言开发shell实现多管道时无法正确获取token数组长度
问题根因
你当前的核心错误是误用sizeof计算动态字符串数组长度:
args是char**类型的指针,不是静态数组,sizeof(args)获取的是指针本身的内存占用:32位编译环境下为4字节,64位环境下为8字节args[0]是char*类型的指针,内存占用和args一致,两者相除结果固定为1,你观测到的8是偶发的异常输出,本质都是该计算逻辑完全失效。
解决方案
C语言中处理动态分配的字符串数组,通用惯例是在数组末尾追加一个NULL指针作为结束标记,不需要额外传长度参数:
- 先确认
my_getline的实现符合该约定:给返回的args数组分配内存时多开1个元素的空间,最后一个元素手动赋值为NULL - 替换你当前的长度计算逻辑,用遍历到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
相关产品推荐
相关产品推荐

