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

Array of strings gets entirely rewrote when I try to append - C (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 位。给出了什么?

我假设 getcmd() 没有为缓冲区 'buf' 分配 space,您在 getcmd() 之外分配 space?如果是这样,那么下面一行:

commands[cmd_count] = buf;

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

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

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

  • 但是你只有一个缓冲区来存储每个命令

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

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

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

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

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