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

时间:2018-01-29 02:29:13

标签: c linux shell xv6

我使用:

声明一个字符串数组

char *commands[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_count在第二次迭代中明显为1,它也重写了第0和第1位置。是什么给了什么?

2 个答案:

答案 0 :(得分:1)

我假设getcmd()没有为缓冲区“buf”分配空间,你是否在getcmd()之外分配了这个空间?如果是这样,那么以下一行:

commands[cmd_count] = buf;

不分配新缓冲区,它只是更新一个char指针以指向一个缓冲区。因此,在两次迭代之后,命令[0]和命令[1]都指向相同的缓冲区,' buf'。

答案 1 :(得分:1)

不了解整个算法,一个简单的方法可能是:

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

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

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

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

for (int i = 0; i < 100; i++) {
    commands[i] = malloc(MAXSTRINGSIZE + 1);
}

(你可以通过分配((MAXSTRINGSIZE + 1)* 100)然后将命令中的每个指针设置为正确的偏移量来优化它,但是如果你只是学习指针,上面的方法可能更容易理解)

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