您不应该进行这种转换,因为类型不兼容。
关于指针和指向指针的指针
char * 是指向字符串的指针,而char ** 是指向字符串指针的指针。 ( const 是奖金)。这可能意味着您应该提供一个字符串数组,而不是提供一个字符串。
这两件事显然是不相容的。不要将它们与演员表混合。
关于 fts_* API
要找到您的问题的解决方案,我们需要阅读 fts_* 函数 API(例如 http://linux.die.net/man/3/fts),我看到了:
FTS *fts_open(char * const *path_argv, int options,
int (*compar)(const FTSENT **, const FTSENT **));
使用您的char * const * 参数path_argv,说明说明:
[...] 如果 compar() 参数为 NULL,则目录遍历顺序为 path_argv 中列出的根路径顺序 [...]
这证实了fts_open 函数确实是一组路径,而不是一个唯一的路径。
所以我猜你需要向它传递如下内容:
char *p[] = { "/my/path", "/my/other/path", "/another/path", NULL } ;
关于const
C 和 C++ 中的类型从右到左读取。所以如果你有:
-
char * : 指向字符的指针
-
char const * :指向 const char 的指针(即不能修改指向的字符串,但可以修改指针)
-
const char * :与char const * 相同
-
char * const : 指向 char 的 const 指针(即可以修改指向的字符串,但不能修改指针)
-
char ** : 指向 char 的指针
-
char * const *:const指针指向char指针(即可以修改指针,也可以修改char的字符串,但不能修改中间指针
这可能会令人困惑,但是一旦您对指针更加熟悉(并且如果您使用 C 或 C++ 编程,您想要成为熟悉指针)。
如果我们回到最初的例子(使用 C99 在 gcc 上发送一堆警告):
char ** p = { "/my/path", "/my/other/path", "/another/path", NULL } ;
我使用过 API,您可以通过两种方式为其提供路径:
char * p0 = "/my/path" ;
char * p1 = "/my/other/path" ;
char * p2 = "/another/path" ;
/* with a fixed-size array */
char * pp[] = {p0, p1, p2, NULL} ;
FTS * fts_result = fts_open(pp, 0, NULL);
Edit 2011-11-10: snogglethorpe 正确评论此解决方案不是 C89 有效解决方案,即使它使用 gcc 成功编译(不包括悬垂 + C89 标志)。有关更多信息,请参阅Error: initializer element is not computable at load time
或:
/* with a malloc-ed array */
char ** pp = malloc(4 * sizeof(char *)) ;
pp[0] = p0 ;
pp[1] = p1 ;
pp[2] = p2 ;
pp[3] = NULL ;
FTS * fts_result2 = fts_open(pp, 0, NULL);
free(pp) ;
编辑
阅读其他人的答案后,只有其中两个(mkb 和moshbear)避免了“just cast the data”错误。
在我自己的回答中,我忘记了数组的 NULL 终止符(但是我不知道 Linux API,也不知道 fts_* 函数类,所以......)