当我尝试附加-C(xv6)时,字符串数组被完全重写

当我尝试附加-C(xv6)时,字符串数组被完全重写,c,linux,shell,xv6,C,Linux,Shell,Xv6,我使用以下命令声明字符串数组: char*命令[100] 然后,我进入一个while循环,该循环读取用户输入的命令: while(getcmd(buf, sizeof(buf), cmd_count) >= 0){ printf(2, "cmd_count: %d\n", cmd_count); buf[strlen(buf)-1] = 0; printf(2, "string buf: -%s-\n", b

我使用以下命令声明字符串数组:

char*命令[100]

然后,我进入一个while循环,该循环读取用户输入的命令:

    while(getcmd(buf, sizeof(buf), cmd_count) >= 0){

            printf(2, "cmd_count: %d\n", cmd_count);
            buf[strlen(buf)-1] = 0;
            printf(2, "string buf: -%s-\n", buf);
            commands[cmd_count] = buf;
            printf(2, "commands: %s\n", commands[0]);
            printf(2, "commands: %s\n", commands[1]);
            printf(2, "commands: %s\n", commands[2]);
            printf(2, "commands: %s\n", commands[3]);
            cmd_count++;
    }
以下是两次迭代的输出:

0 EZ$ ls
cmd_count: 0
string buf: -ls-
commands: ls
commands: (null)
commands: (null)
commands: (null)

EZ$ echo hello
cmd_count: 1
string buf: -echo hello-
commands: echo hello
commands: echo hello
commands: (null)
commands: (null)
尽管在第二次迭代中,
cmd\u count
显然是1,但它重写了第0位和第1位。给出了什么?

我假设getcmd()不为缓冲区'buf'分配空间,而您在getcmd()之外分配空间?如果是,则显示以下行:

commands[cmd_count] = buf;
不分配新的缓冲区,它只是更新一个字符指针以指向一个缓冲区。因此,在两次迭代之后,命令[0]和命令[1]都指向同一个缓冲区“buf”。

我假设getcmd()不为缓冲区“buf”分配空间,而您在getcmd()之外分配该空间?如果是,则显示以下行:

commands[cmd_count] = buf;

不分配新的缓冲区,它只是更新一个字符指针以指向一个缓冲区。因此,经过两次迭代后,命令[0]和命令[1]都指向同一个缓冲区“buf”。

不知道整个算法,一个简单的方法可能是:

  • 目前,您已经分配了变量命令来保存100个字符指针,这样您就有了处理cmd_count 0-99的空间

  • 但您只有一个用于存储每个命令的缓冲区

  • 如果确实需要将每个命令存储到读取它们的while循环之后,那么以下方法如何:

为命令中足以容纳命令的每个指针分配一个缓冲区

for (int i = 0; i < 100; i++) {
    commands[i] = malloc(MAXSTRINGSIZE + 1);
}
for(int i=0;i<100;i++){
命令[i]=malloc(MAXSTRINGSIZE+1);
}
(您可能可以通过分配((MAXSTRINGSIZE+1)*100)然后将命令中的每个指针设置为正确的偏移量来优化此设置,但如果您只是学习指针,上述方法可能更容易理解)

  • 然后尝试用命令[i]替换getcmd()调用中的buf,以便将命令直接读入commands数组中的条目

    • 由于不知道整个算法,一个简单的方法可能是:

      • 目前,您已经分配了变量命令来保存100个字符指针,这样您就有了处理cmd_count 0-99的空间

      • 但您只有一个用于存储每个命令的缓冲区

      • 如果确实需要将每个命令存储到读取它们的while循环之后,那么以下方法如何:

      为命令中足以容纳命令的每个指针分配一个缓冲区

      for (int i = 0; i < 100; i++) {
          commands[i] = malloc(MAXSTRINGSIZE + 1);
      }
      
      for(int i=0;i<100;i++){
      命令[i]=malloc(MAXSTRINGSIZE+1);
      }
      
      (您可能可以通过分配((MAXSTRINGSIZE+1)*100)然后将命令中的每个指针设置为正确的偏移量来优化此设置,但如果您只是学习指针,上述方法可能更容易理解)

      • 然后尝试用命令[i]替换getcmd()调用中的buf,以便将命令直接读入commands数组中的条目

      你是对的。。你建议我怎么解决这个问题?是否有一种不同的数据结构可以用来创建字符串数组而不是使用字符指针?你是对的。。你建议我怎么解决这个问题?我是否可以使用不同的数据结构来创建字符串数组而不是使用字符指针?请编辑您的问题并添加一个。
      printf(2,“cmd\u count:%d\n”,cmd\u count)应该是
      printf(“cmd\u计数:%d\n”,cmd\u计数)
      您的尝试会产生
      “警告:传递'printf'的参数1会使指针从整数变为非强制转换”
      @DavidC.Rankin您可能没有在xv6环境中进行测试啊,您可能是对的。谢谢你,汤姆。现在我知道这是一个像CS50这样古怪的问题…请编辑您的问题并添加一个。
      printf(2,“cmd\u count:%d\n”,cmd\u count)应该是
      printf(“cmd\u计数:%d\n”,cmd\u计数)
      您的尝试会产生
      “警告:传递'printf'的参数1会使指针从整数变为非强制转换”
      @DavidC.Rankin您可能没有在xv6环境中进行测试啊,您可能是对的。谢谢你,汤姆。现在我知道这是一个像CS50这样古怪的东西。。。