これは古い質問ですが、私はそれに出くわし、man ページほど効果的に質問を解決できなかったので、今後の新しい回答として man ページからコード スニペットをコピーしています。
#include <dirent.h>
int
main(void)
{
struct dirent **namelist;
int n;
n = scandir(".", &namelist, NULL, alphasort);
if (n < 0)
perror("scandir");
else {
while (n--) {
printf("%s\n", namelist[n]->d_name);
free(namelist[n]);
}
free(namelist);
}
}
関数 scandir()
がメモリを割り当てます。
メモリを割り当てる必要はありません。あなたは する scandir()
によって返されたメモリを解放する必要があります .
あなたのコード呼び出し:*noOfFiles = scandir(path, &fileListTemp, NULL, alphasort);
戻ったら、noOfFiles
path
にディレクトリ エントリの数が含まれます ディレクトリ、および fileListTemp
割り当てられた struct dirent への割り当てられたポインタの配列を指します それぞれが d_name を持つブロブ ファイル/ディレクトリのヌル終了名を指すメンバー。
たとえば、ディレクトリに「FirstFile.txt」、「AnotherFile.txt」、「ThirdFile.txt」というファイルが含まれている場合、scandir()
から戻ったときに呼び出しが行われます。 、 noOfFiles
5 に設定されます 3 つのファイルに加えて、"." 用にさらに 2 つのファイルが含まれます。および「..」ディレクトリエントリ。 「alphasort」を通過しない場合、エントリは特定の順序にはなりません。 (実際には少し間違っています。ファイルが最初に作成された順序に応じて、ディレクトリ ファイル名エントリの順序になります。)
'alphasort' を渡したので、次の順序でエントリが表示されるはずです (null-byte-string-terminator を明示的に表示しています:
fileListTemp[0]->d_name == ".\0"
fileListTemp[1]->d_name == "..\0"
fileListTemp[2]->d_name == "AnotherFile.txt\0"
fileListTemp[3]->d_name == "FirstFile.txt\0"
fileListTemp[4]->d_name == "ThirdFile.txt\0"
したがって、fileListTemp は、5 つの struct dirent を保持する割り当てられたメモリのブロックを指します。 ポインター。 5 つの struct dirent のそれぞれ ポインタは struct dirent を指します d_name に null で終わるディレクトリ エントリ名を含む、割り当てられたメモリのブロック メンバー。 (d_name エントリもポインタであるため、これも単純化されていますが、割り当てられたブロックの末尾に追加で割り当てられたスペースを指し、エントリ名がそこに格納されます。)
6 です 割り当てられたメモリのブロック。
この割り当てられたメモリは、使い終わるまで使用できます。その後、配列内の各エントリで free() を呼び出し、続いて配列自体の free() を呼び出します。
配列自体だけでなく、すべてのエントリを解放する必要があります。それらはすべて独立して割り当てられたメモリのブロブです。
リストが完成したら、次のことを行う必要があります:
for (int i = 0; i < noOfFiles; i++)
{
free(fileListTemp[i];
}
free(fileListTemp);