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