Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 指向指针的指针不';t存储所有值—;只有最后一个_C - Fatal编程技术网

C 指向指针的指针不';t存储所有值—;只有最后一个

C 指向指针的指针不';t存储所有值—;只有最后一个,c,C,问题是当我试图打印 (*names)[*number],我只存储最后一个 我将用一个例子来解释我的意思-我想要的是: (*names)[0] = "john" (*names)[1] = "bill" (*names)[2] = "nick" 当我打印(*names)[*number]的值时,我得到的是: (*names)[0] = "nick" (*names)[1] = "nick" (*names)[2] = "nick" 代码如下: int GetFiles(char *

问题是当我试图打印
(*names)[*number]
,我只存储最后一个

我将用一个例子来解释我的意思-我想要的是:

 (*names)[0] = "john"
 (*names)[1] = "bill"
 (*names)[2] = "nick"
当我打印
(*names)[*number]
的值时,我得到的是:

 (*names)[0] = "nick"
 (*names)[1] = "nick"
 (*names)[2] = "nick"
代码如下:

int GetFiles(char **dir,char ***names,int *number)
{
    struct dirent *dp;
    DIR *fd;
    int i;

    if ((fd = opendir(*dir)) == NULL)
    {
        printf("Can't open directory %s!\n",*dir);
        return 0;
    }
    *number = 0;

    //*names = (char**)malloc(((*number)+1) * sizeof(char*));

    *names = (char**)malloc(17*sizeof(char*));

    while ((dp = readdir(fd)) != NULL)
    {
        if (!strcmp(dp->d_name, ".") || !strcmp(dp->d_name, ".."))
        {
            continue;
        }

        (*names)[*number] = dp->d_name;

        (*number)++;

        //*names = (char**)realloc(*names,((*number)+1) * sizeof(char*));
    }

    closedir(fd);

    for(i=0;i<*number;i++)
    {
        printf("--%s\n",(*names)[i]);
    }

    system("PAUSE");
    return 1;
}
intgetfiles(char**dir,char***名称,int*number)
{
结构方向*dp;
DIR*fd;
int i;
如果((fd=opendir(*dir))==NULL)
{
printf(“无法打开目录%s!\n”,*dir);
返回0;
}
*数字=0;
//*名称=(字符**)malloc((*数字)+1)*sizeof(字符*);
*name=(char**)malloc(17*sizeof(char*);
而((dp=readdir(fd))!=NULL)
{
如果(!strcmp(dp->d_name,“.”)| |!strcmp(dp->d_name,“…”))
{
继续;
}
(*名称)[*编号]=dp->d_名称;
(*数字)++;
//*名称=(字符**)realloc(*名称,((*编号)+1)*大小(字符*);
}
closedir(fd);

对于(i=0;itry
(*名称)[*编号]=dp->d_名称;
-->
(*名称)[*编号]=strdup(dp->d_名称)
谢谢BLUEPIXY,它成功了。你能给我解释一下我的代码失败的原因吗?
dp->d_name
被假定为同一内存块的地址。所以复制一份。它需要
以后释放
readdir
每次都返回一个指向同一结构的指针,只是填入了不同的信息。你的原版l code只保存
d_name
的地址,该地址不会更改,因此数组中的每个条目都包含相同的指针。您看到的名称是返回的姓氏
readdir
。感谢大家的帮助!现在一切都清楚了。