execv参数错误-“预期为char * const *,但参数为const char *类型”

时间:2020-09-12 04:35:04

标签: arrays c pointers exec

我有一个函数,其参数为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);
}

1 个答案:

答案 0 :(得分:0)

首先,错误消息未正确复制。如果我在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的函数。 那就是编译器告诉你的。

现在,您如何摆脱该警告... 要使编译器静音,您可以尝试使用一些有关该参数真实性质的强制转换和作弊方法。 最后,问题将保持不变。试图修改只读内存的功能将无法正常工作。

相反,您需要复制数据:

#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;
}