如何在C中的(char * argv [])数组的末尾附加一个值。基本上我正在尝试解决父将命令行args(在argv []中)传递给子节点的问题添加数字。为每两个数字创建一个子项并在argv []中传递它们。想要将从子项返回的结果总和再次附加到父项以创建子进程,直到该数字减少为1。
答案 0 :(得分:4)
基本上我正在努力解决一个问题,即父将命令行args(在
argv[]
)中传递给子项以添加数字。我正在为每两个数字创建一个孩子并在argv[]
中传递它们。我想将从子节点返回的结果总和再次附加到父节点以创建子进程,直到数字减少为1。
这是不可行的;子进程的内存与父进程的内存完全分开。孩子不能直接修改父母的记忆。您需要使用某种形式的IPC(进程间通信)来从子进程中获取信息。
你当然可以将这些论点传递给孩子们;那是(相对)直截了当的。但是,您需要一个诸如管道之类的机制来为父级检索答案。
请注意,此机制有助于说明流程之间进行通信所涉及的问题;作为一种添加数字的方法没有意义,因为与在单个程序中完成工作的成本相比,流程启动和IPC的开销是巨大的。
如何在C中的(char * argv [])数组的末尾追加一个值。
如果你想这样做,你将不得不:
argc
和argv
的新值。argv
(除非您的程序在完成新值时退出或执行,在这种情况下,您不需要免费吧)。概述:
char **newv = malloc((argc + 2) * sizeof(*newv));
// Error check omitted
memmove(newv, argv, sizeof(*newv) * argc);
newv[argc] = new_value;
newv[argc+1] = 0;
argc++;
argv = newv;
...
free(newv);
答案 1 :(得分:1)
一般来说,你不能/不应该。
没有定义系统如何分配这个内存 - 你可能运气不好,它可以在一个系统上运行,但下一个系统可能没有!
答案 2 :(得分:1)
更改子进程中的argv
数组不更改父进程中的数组。操作系统在子地址空间中创建命令行参数的副本。您必须找到另一种方法将信息从孩子传递回父母。
答案 3 :(得分:1)
简答:你做不到。 C组织记忆的方式不允许。
长答案(如果我错了请纠正我)
在函数int main(int, char**)
中,您传递了两个变量。第一个是整数,第二个是指向指针的指针(char **
几乎与char*[]
相同)。你只知道关于这个指针的两件事:
argv
指向argc
类型的char *
指针,所有指针都在内存中一个接一个地存储(argv + 1
指向下一个指针内存如果argc > 1
)。
每个指针argv + i
(当然0 < i < argc
)由未知数量的字符和终止\0
组成。
你不知道
查看比我更快的答案,了解如何做到这一点:How to append a value at the end of the char* argv[] array in C language?