繁体   English   中英

在C语言中,将指针的目标作为参数传递给函数时,将其修改为指针数组

[英]In C, modify the target of a pointer to an array of pointers when passed as argument to a function

我想要一个返回给定目录内容的函数。 为此,我正在使用dirent.h scandir 下面的代码编译成功(gcc -Wall test.c),但是最后一个printf导致分段错误。 这意味着该函数之后的“ eps”结构(指向不同结构的指针数组的指针)仍然为空:如何解决此问题?

#include <stdlib.h>
#include <stdio.h>
#include <dirent.h>
#include <string.h>

static int myselector(const struct dirent * dir_entry)
{
  char * pch = strstr(dir_entry->d_name, ".");
  return pch == NULL ? 1 : 0;
}

int list_dir(char * dirname, struct dirent ** eps)
{
  int nbfiles = scandir(dirname, &eps, myselector, alphasort);
  if(nbfiles > 0)
  {
    printf("inside function: %s\n", eps[0]->d_name);
    return 1;
  }
  else
    return 0;
}

int main(int argc, char *argv[])
{
  int status = 0;
  struct dirent ** eps = NULL;
  status = list_dir("/home", eps);
  if (status)
  {
    puts("ok");
    printf("outside function: %s\n", eps[0]->d_name);
  }
  return EXIT_SUCCESS;
}

您似乎没有涵盖scandir返回0(即空目录)的情况。 返回值-1仅用于错误。

因为您的指针已更改,并且您正在main()查看错误的内容:)

您正在传递一个指针,该指针指向一个指向scandir()的指针。 它正在更改指向指针的指针所指向的内容(我知道,这很讨厌读取...)。

因为您要在函数中使用&eps调用scandir() ,所以您会在函数之外丢失所做的更改。 eps的值在您的函数内已更改。

为了更好地理解这一点,在您当前的函数中,将scandir()调用与printf()语句一起包装,以向您显示eps包含的值是什么:

...
printf("%p\n", eps);
int nbfiles = scandir(dirname, &eps, myselector, alphasort);
printf("%p\n", eps);
...

要解决此问题,请将功能更改为:

int list_dir(char * dirname, struct dirent *** eps)
{
  int nbfiles = scandir(dirname, eps, myselector, alphasort);
  if(nbfiles != -1)
  {
    printf("inside function: %s\n", (*eps)[0]->d_name);
    return 1;
  }
  else
    return 0;
}

并称它为...

status = list_dir("/home", &eps);

main() 然后它将完美运行:

broach @ roach-VirtualBox:〜$ ./test
内部功能:拉刀

外部功能:拉刀

使list_dir采用struct dirent ***而不是struct dirent ** ,在scandir()调用中删除&运算符,并将其从main添加到list_dir()调用。 list_dir()的第一行变为:

int list_dir(char * dirname, struct dirent *** eps)
{
  int nbfiles = scandir(dirname, eps, myselector, alphasort);

并且main中的list_dir()调用变为:

status = list_dir("/home", &eps);

这样,list_dir()可以让scandir()通过其地址修改main()中的eps ,而不用修改堆栈上传递给list_dir()的参数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM