代码之家  ›  专栏  ›  技术社区  ›  Dr. Debasish Jana

C命令行参数中为argv分配的缓冲区大小

  •  0
  • Dr. Debasish Jana  · 技术社区  · 7 年前

    int main(int argc, char **argv) {
    . . .
    }
    

    argc 大于等于1 所以,至少 argv[0] 我的问题是分配的缓冲区的大小是多少 argv[1] , argv[2] 等?

    3 回复  |  直到 7 年前
        1
  •  2
  •   Sourav Ghosh    7 年前

    我们知道argc大于等于1

    嗯,那不是真的。它应该是非负的。也可以是0。

    argv[n] 存在,大小 是平台中指针的大小。指针指向的内存大小与提供的命令行参数字符串相同(由基础环境提供)。

    引用 C11

    • argc的值应为非负。

    而且,

    • argc 大于零,则数组成员 argv[0] 通过 argv[argc-1] 从托管环境中的其他地方。[...]

    • argc公司 大于零,则字符串由 argv[0] argv[0][0] 如果 程序名在主机环境中不可用。如果argc的值为 大于1,由 argv[1] 通过 程序参数 .

        2
  •  1
  •   JeremyP    7 年前

    argv[0] 以及随后的论点

    例如,在一个典型的Unix系统上

    cat /etc/passwd
    

    argc 将两个缓冲区分配给 argv[0] 将至少为4个字节,并将缓冲区分配给 argv[1] 将至少为12字节。对于缓冲区的大小、分配方式和分配位置,您不能做任何其他假设。所有这些都由之前运行的前奏代码处理 main .

        3
  •  0
  •   Sami Hult    7 年前

    我认为完整的答案是,正如在一篇评论中所说的:它依赖于平台。

    但从源代码来看,至少linux内核只会将必要的字节复制到程序堆栈中。

    那么也不能保证你的编译器不会对参数施展魔法。