为什么 execv*() 参数与 execl*() 不一致?

Why are execv*() arguments inconsistent with execl*()?

为什么 execv*() 函数族的 argv 参数是 char * const []arg0...n 函数族的 execl*() 参数是 const char * ?这只是标准中的一个错误,它应该是 const char * const [] 或者是否有理由让字符串在数组情况下是非常量但在显式传递的参数情况下是常量?

   int execl(const char *path, const char *arg0, ... /*, (char *)0 */);
   int execv(const char *path, char *const argv[]);
   int execle(const char *path, const char *arg0, ... /*,
          (char *)0, char *const envp[]*/);
   int execve(const char *path, char *const argv[], char *const envp[]);
   int execlp(const char *file, const char *arg0, ... /*, (char *)0 */);
   int execvp(const char *file, char *const argv[]);

我找不到权威的答案,但我怀疑这两个调用签名的不同之处在于它们的创建方式和使用方式。

execl*() 的情况下,您的函数完全有可能被传递给您正在传递的 const char*。如果 execl*() 的签名不是 const char*,那么您将收到编译器警告。

execv*() 的情况下,由于它是一个可能由您构建的数组,因此保持字符串值的恒定性并不那么重要。但重要的是 execv*() 不操纵指针——否则可能会修改最后一个元素,使其不再正确指向 NULL——这是必需的。

也许更熟悉规范的人可以澄清我可能哪里出错了。