将char *转换为char * const *

请原谅我这个问题的基本“问题”.我有时会迷上指针.我有一个char *但我需要将它转换为char * const *才能在fts()函数中正确使用它.我怎么做?

谢谢

最佳答案
您不应该进行这种转换,因为类型不兼容.

关于指针和指针的指针

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,描述说明:

[…] If the compar() argument is NULL,the directory traversal order is in the order listed in path_argv for the root paths […]

这证实了fts_open函数确实是一个路径集合,而不是唯一的路径.

所以我想你需要传递给它的东西如下:

char *p[] = { "/my/path","/my/other/path","/another/path",NULL } ;

关于const

C和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",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,NULL);

Edit 2011-11-10: 07002 rightfully commented this solution is not a C89 valid solution,even if it compiles successfully with gcc (excluding pendantic + C89 flags). See 07003 for more info on that

要么:

    /* 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,NULL);
    free(pp) ;

编辑

在阅读其他答案之后,只有其中两个(mkbmoshbear)避免“只是转换数据”错误.

在我自己的回答中,我忘记了数组的NULL终止符(但后来我不知道Linux API,也不知道fts_ *类的函数,所以…)

相关文章

1、安装Apache。 1)执行如下命令,安装Apache服务及其扩展包...
一、先说一下用ansible批量采集机器信息的实现办法: 1、先把...
安装配置 1. 安装vsftpd 检查是否安装了vsftpd # rpm -qa | ...
如何抑制stable_secret读取关键的“net.ipv6.conf.all.stabl...
1 删除0字节文件 find -type f -size 0 -exec rm -rf {} ...
## 步骤 1:安装必要的软件包 首先,需要确保系统已安装 `dh...