如何在C中清除此数组指针?

我正在尝试使用系统调用进行基本的bash,但是我对指针数组有一些小问题。

为了恢复我的代码,我从stdin中读取带有read()的命令到缓冲区然后我使用strsep()将命令与参数和所有参数分离到一个数组中。 然后我用fork()创建一个新进程,并使用execvp()的相关参数执行该命令。

所有这一切都进入无限循环,直到用户键入“退出”(尚未编码)。 问题是在第一次迭代之后,我需要* pArgs为空,用于下一个命令和参数。 我不知道怎么做……

这是我的代码:

#include  #include  #include  #include  int main(int argc, char **argv) { char bBuffer[BUFSIZ], *pArgs[10], *aPtr = NULL, *sPtr; int aCount; pid_t pid; while(1) { write(1, "\e[1;31mmyBash \e[1;32m# \e[0m", 27); read(0, bBuffer, BUFSIZ); sPtr = bBuffer; aCount = 0; do { aPtr = strsep(&sPtr, " "); pArgs[aCount++] = aPtr; } while(aPtr); pArgs[aCount-2][strlen(pArgs[aCount-2])-1] = '\0'; // Debug code to output pArgs content write(1, "|>", 2); write(1, pArgs[0], strlen(pArgs[0])); write(1, " 1) { pid = fork(); if(pid == -1) { perror("fork"); exit(1); } if(pid == 0) { execvp(pArgs[0], pArgs); exit(0); } } } return 0; } 

PS:很抱歉,我目前无法提供输入和输出测试用例。 希望这不是很难理解和修复,你们不需要它。 如果需要,我会稍后发布它…

只是为了清理:
我知道我问如何清除arrays,我得到了答案。 但现在我觉得很明显,我的问题不在于此,而是由litb指出缓冲区正在收集的垃圾。 使用空字符终止字符串比清除数组更有意义。 这就是为什么我将litb的答案标记为正确的答案。

您的问题是在读取数据后不添加空字符。 所以strsep调用不知道在哪里停止。 在C中,字符串必须以空字符(称为终止空字符)终止。

 // don't forget to add error handling at some point (s == -1) ssize_t s = read(0, bBuffer, BUFSIZ-1); bBuffer[s] = '\0'; 

有了这个,我不知道现在应该清除什么数组,因为execvp将读取参数直到第一个空指针。 然而, do循环已经添加了空指针,这是最后一次调用strsep返回的空指针。

问题当然也可以通过清除bBuffer(扫描第一个命令后*pArgs指向的数据)来解决。 请注意,您必须在第一次扫描之前执行此操作,因为您无法假设bBuffer数组中的字符被初始化为任何合理的值。

 memset(bBuffer, 0, sizeof bBuffer); 

放在read调用之前(但在任何情况下,最大限度地只读取BUFSIZE-1 ,因为终止空字符也必须有空格!)。

但正如我上面所示,你不需要这个memset调用。 只需手动添加终止空字符。

 int i; for (i = 0; i < 10; i++) pArgs[i] = NULL;