【问题标题】:execv arguments error - "expected char * const* but argument is of type const char *"execv 参数错误 - “预期为 char * const* 但参数的类型为 const char *”
【发布时间】:2023-04-08 02:14:01
【问题描述】:

我有一个函数,它的参数是const char *array[]

array[0]为路径,其余为参数,以NULL结尾。

但是,如果我尝试做execv(array[0], array),我会得到expected char * const* but argument is of type const char *

我该怎么做,char * const*const char * 有什么区别?

void start(const char *array[]) {
    execv(array[0], array);
}

【问题讨论】:

  • 你好像有几个*太多了。这是在复制过程中发生的,还是你真的有 *** 的东西?
  • 请展示一个完整的示例,您如何调用该函数。你如何定义和初始化你的数组?
  • 是的,很抱歉 * 是一个错误,现在已修复。
  • 我添加了函数,以及我是如何实现 execv 的。但这是一个错误,我不知道为什么
  • 从您的参数列表中删除 const

标签: arrays c pointers exec


【解决方案1】:

首先,错误信息没有正确复制。如果我在 GCC 中运行您的代码,它会显示此消息(注意最后的 *):

note: expected ‘char * const*’ but argument is of type ‘const char **’

这更有意义,因为您在问题中显示的消息与您显示的代码不匹配。级别或间接性不匹配。

话虽如此,让我们看看这部分:

char * const*const char * 有什么区别?

其实是

char * const*const char ** 有什么区别?

第一个是指向 char 的 const 指针。指向的char 不是const,理论上可能会被execv 更改。

后者是一个指向 const char 的指针。这意味着不能修改指向的char。它可能是 ROM 中的一些只读字符串文字。如果您将这样的指针传递给将尝试修改它的函数,它将以一种或另一种方式失败。因此,不允许将“指向 const 的指针”传递给不希望它为 const 的函数。 这就是编译器告诉你的。

现在,你怎么能摆脱那个警告...... 要使编译器静音,您可以尝试使用一些强制转换并欺骗该参数的真实性质。 最终问题将保持不变。试图修改您的只读内存的函数将无法正常工作。

相反,您需要复制您的数据:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

void start(const char *array[]) {
    int i = 0;

    // determine number of strings (including NULL)
    while (array[i++] != NULL) ;

    // Create an array able to hold pointers to copys
    char *my_array[i];

    // Copy strings into non-const memory 
    i = 0;
    do 
        my_array[i] = array[i] ? strdup(array[i]) : NULL;
    while (array[i++] != NULL);
    
    execv(my_array[0], my_array);

    // Free the memory for the copied strings
    i = 0;
    do 
        free(my_array[i]);
    while (array[i++] != NULL);

}

int main(void)
{
    const char *argv[] = {"ls", "ls", NULL};
    
    start(argv);
    
    return 0;
}

【讨论】:

    最近更新 更多