未初始化的值是由堆栈分配创建的 - 无法找到我出错的地方

时间:2017-08-04 02:31:37

标签: c initialization valgrind

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结果:

Valgrind Results

xcode输出:

xcode output

我无法找到我在这里出错的地方。我为命令行编写了一些简单的代码,可以接受带有参数列表的命令。该程序对于长度为< = 7的字符串数组运行良好,并且在第一次输入此大小的命令后,对每个命令数组都有效。我无法弄清楚我在哪里使用未初始化的值。当代码中断时,循环遍历我的arguments数组时会遇到错误的访问。我怀疑它可能与main中的while循环有关,它填充了arguments数组,但我可能错了。真的坚持这个。感谢您的帮助或建议您是否有任何想法。

1 个答案:

答案 0 :(得分:4)

memset(arguments, '\0' , (sizeof *arguments * sizeof arguments[0]))

这是您的代码导致未初始化值的问题。

*argumentsarguments[0]相同。 sizeofsizeof(char*)都是memset(arguments, '\0', sizeof(arguments));

这意味着您只在缓冲区中初始化几个条目。

你需要

memset(line, '\0', sizeof(line));

前一行

也是如此
$(document).ready()