簡體   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