int main(){
char *input = NULL;
char *line[2048];
size_t inputChars = 0;
size_t bufferSize = 0;
char *command = NULL;
char *arguments[2048];
printf(":");
fflush(stdout);
while((inputChars = getline(&input , &bufferSize , stdin)) > 0){
memset(line, '\0' , (sizeof *line * sizeof line[0]) );
memset(arguments, '\0' , (sizeof *arguments * sizeof arguments[0]));
if(inputChars == -1){
clearerr(stdin);
}
else{
parseLine(input,line);
command = line[0];
int i = 0;
int j = 1;
while(line[j] != NULL)
{
arguments[i] = line[j];
i++;
j++;
}
if((*line[0] != '#') && (*line[0] != '\n'))
{
runCommand(command,arguments);
}
printf(":");
fflush(stdout);
}
input = NULL;
}
}
int isBackground(char* args[])
{
int i = 0;
int pos = 0;
while (args[i] != NULL)
{
pos++;
i++;
}
if (*args[pos - 1] == '&')
{
background++;
return true;
}
else return false;
}
void runCommand(char* cmd, char* args[])
{
printCommandLine(cmd, args);
if (isBackground(args))
{
printf("Background Processes: %i\n",background);
}
}
void printCommandLine(char* cmd, char* args[])
{
printf("Command: %s\n",cmd);
printf("Arguments:\n");
int i = 0;
while (args[i] != NULL)
{
printf("%s\n",args[i]);
i++;
}
}
Valigrind结果:
xcode输出:
我无法找到我在这里出错的地方。我为命令行编写了一些简单的代码,可以接受带有参数列表的命令。该程序对于长度为< = 7的字符串数组运行良好,并且在第一次输入此大小的命令后,对每个命令数组都有效。我无法弄清楚我在哪里使用未初始化的值。当代码中断时,循环遍历我的arguments数组时会遇到错误的访问。我怀疑它可能与main中的while循环有关,它填充了arguments数组,但我可能错了。真的坚持这个。感谢您的帮助或建议您是否有任何想法。
答案 0 :(得分:4)
memset(arguments, '\0' , (sizeof *arguments * sizeof arguments[0]))
这是您的代码导致未初始化值的问题。
*arguments
与arguments[0]
相同。 sizeof
和sizeof(char*)
都是memset(arguments, '\0', sizeof(arguments));
。
这意味着您只在缓冲区中初始化几个条目。
你需要
memset(line, '\0', sizeof(line));
前一行
也是如此$(document).ready()