如何在C语言的char * argv []数组末尾附加一个值?

时间:2011-10-16 18:59:44

标签: c

如何在C中的(char * argv [])数组的末尾附加一个值。基本上我正在尝试解决父将命令行args(在argv []中)传递给子节点的问题添加数字。为每两个数字创建一个子项并在argv []中传递它们。想要将从子项返回的结果总和再次附加到父项以创建子进程,直到该数字减少为1。

4 个答案:

答案 0 :(得分:4)

编辑问题后

  

基本上我正在努力解决一个问题,即父将命令行args(在argv[])中传递给子项以添加数字。我正在为每两个数字创建一个孩子并在argv[]中传递它们。我想将从子节点返回的结果总和再次附加到父节点以创建子进程,直到数字减少为1。

这是不可行的;子进程的内存与父进程的内存完全分开。孩子不能直接修改父母的记忆。您需要使用某种形式的IPC(进程间通信)来从子进程中获取信息。

你当然可以将这些论点传递给孩子们;那是(相对)直截了当的。但是,您需要一个诸如管道之类的机制来为父级检索答案。

请注意,此机制有助于说明流程之间进行通信所涉及的问题;作为一种添加数字的方法没有意义,因为与在单个程序中完成工作的成本相比,流程启动和IPC的开销是巨大的。

在编辑问题之前

  

如何在C中的(char * argv [])数组的末尾追加一个值。

如果你想这样做,你将不得不:

  1. 分配一个足够大的新数组以获得额外的价值。
  2. 将现有值从旧数组复制到新数组。
  3. 添加新值。
  4. 确保其余代码在适当时使用argcargv的新值。
  5. 确保在不再需要时释放新的argv(除非您的程序在完成新值时退出或执行,在这种情况下,您不需要免费吧)。
  6. 概述:

    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*[]相同)。你只知道关于这个指针的两件事:

  1. argv指向argc类型的char *指针,所有指针都在内存中一个接一个地存储(argv + 1指向下一个指针内存如果argc > 1)。

  2. 每个指针argv + i(当然0 < i < argc)由未知数量的字符和终止\0组成。

  3. 你不知道

    1. 记忆在哪里。
    2. 如何更改。
    3. 查看比我更快的答案,了解如何做到这一点:How to append a value at the end of the char* argv[] array in C language?