【问题标题】:Array of strings gets entirely rewrote when I try to append - C (xv6)当我尝试追加时,字符串数组被完全重写-C(xv6)
【发布时间】:2018-01-29 02:29:13
【问题描述】:

我通过以下方式声明一个字符串数组:

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 位。什么给了?

【问题讨论】:

  • 请编辑您的问题并添加minimal reproducible example
  • printf(2, "cmd_count: %d\n", cmd_count); 应该是 printf("cmd_count: %d\n", cmd_count); 您的尝试会产生 "warning: passing argument 1 of ‘printf’ makes pointer from integer without a cast"
  • @DavidC.Rankin 你可能没有在 xv6 环境中测试
  • 啊,你可能是对的。谢谢汤姆。现在我知道它是像 CS50 这样古怪的东西之一......

标签: c linux shell xv6


【解决方案1】:

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

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

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

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

    commands[cmd_count] = buf;
    

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

    【讨论】:

    • 你是对的.. 你会建议我如何解决这个问题?是否可以使用不同的数据结构来创建字符串数组而不是使用 char 指针?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-09
    • 2017-04-03
    • 1970-01-01
    • 2011-08-24
    • 1970-01-01
    相关资源
    最近更新 更多