我使用:
声明一个字符串数组 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位置。是什么给了什么?
答案 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)然后将命令中的每个指针设置为正确的偏移量来优化它,但是如果你只是学习指针,上面的方法可能更容易理解)