请原谅我这个问题的基本"问题".我有时会迷上指针.我有一个,char *但我需要将其转换char * const *为能够在fts()函数中正确使用它.我怎么做?
谢谢
pae*_*bal 11
您不应该进行这种转换,因为类型不兼容.
char *是指向字符串char **的指针,而指向指向字符串的指针.(const是奖金).这可能意味着您应该提供一个字符串数组,而不是提供字符串.
这两件事显然是不相容的.不要将它们与石膏混合.
要找到问题的解决方案,我们需要阅读fts_*函数API(例如,在 http://linux.die.net/man/3/fts),我明白了:
FTS *fts_open(char * const *path_argv, int options,
int (*compar)(const FTSENT **, const FTSENT **));
Run Code Online (Sandbox Code Playgroud)
使用您的char * const *参数path_argv,说明解释:
[...]如果compar()参数为NULL,则目录遍历顺序为path_argv中为根路径[...]列出的顺序
这证实了该fts_open函数确实是一个路径集合,而不是唯一的路径.
所以我想你需要传递给它的东西如下:
char *p[] = { "/my/path", "/my/other/path", "/another/path", NULL } ;
Run Code Online (Sandbox Code Playgroud)
constC和C++中的类型从右到左阅读.所以如果你有:
char * :指向char的指针char const * :指向const char的指针(即你不能修改指向的字符串,但你可以修改指针)const char * :一样的 char const *char * const :const指向char的指针(即你可以修改指向的字符串,但你不能修改指针)char ** :指向char的指针char * const * :指向char的const指针(即你可以修改指针,你可以修改char的字符串,但你不能修改中间指针它可能会让人感到困惑,但是一旦你对指针更熟悉,就会清楚地按从右到左的顺序读取它们(如果你用C或C++编程,你想熟悉指针).
如果我们回到最初的例子(使用C99在gcc上发送一堆警告):
char ** p = { "/my/path", "/my/other/path", "/another/path", NULL } ;
Run Code Online (Sandbox Code Playgroud)
我使用了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);
Run Code Online (Sandbox Code Playgroud)
编辑2011-11-10: snogglethorpe正确评论此解决方案不是C89有效的解决方案,即使它与gcc成功编译(不包括pendantic + C89标志).请参阅错误:初始化元素在加载时是不可计算的,以获取更多信息
要么:
/* 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) ;
Run Code Online (Sandbox Code Playgroud)
在阅读其他答案后,只有其中两个(mkb和moshbear)避免"只是转换数据"错误.
在我自己的回答中,我忘记了数组的NULL终止符(但后来我不知道Linux API,也不知道fts_*类的函数,所以...)