核心理论
- 指针定义,只管单位大小。
- 内存分配,要管连续性,和数量。
- 几次分配就需要几次回收。
次要说教
- 当main传递一个char **p 过来是,就是传递了一个地址过来,这个地址p一次就指向了 char ** (char ** 就是一个char *的数组)。文件名就得用char *,再套一层char *的地址数组。
- char * 的内存是有大有小。
- char ** 的内存都是8k。
- 一堆连续的 char **就表示了一堆的文件名称。
- 把这个char **的内存搞好了。
- 再把这个 char **的值传回去就好了,这个charr ** 的值也是一个地址。
GetDirFiles.c
#include "head.h"
int GetDirFiles(char *FilePath, char ***FileNamesAddrs, int *FileNamAddrs)
{
DIR *datatrade_bak_dir;
struct dirent *entry;
if ((datatrade_bak_dir = opendir(FilePath)) == NULL)
{
return -1;
}
int FileCount = 0;
char **FileNames = (char **)calloc(sizeof(char *), 10);
char *n = NULL;
while ((entry = readdir(datatrade_bak_dir)) != NULL)
{
if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0)
{
continue;
}
n = (char *)malloc(sizeof(char) * strlen(entry->d_name)+1);
strcpy(n, entry->d_name);
printf("当前文件:%s\n", n);
FileNames[FileCount++] = n;
}
closedir(datatrade_bak_dir);
*FileNamesAddrs = FileNames;
*FileNamAddrs = FileCount;
return 0;
}
main.c
#include "head.h"
void main(int agrc, char *agrv[])
{
char *FilePath;
if (agrc < 2)
{
printf("Usage:%s <dirname>\n", "当前目录");
FilePath = ".";
}
else
{
FilePath = agrv[1];
}
char **FileNames;
int FileCount;
GetDirFiles(FilePath, &FileNames, &FileCount);
for (int i = 0; i < FileCount; i++)
{
printf("=%p=%s==\n", FileNames[i], FileNames[i]);
}
char *p = FileNames[4];
for (int i = 0; i < FileCount; i++)
{
printf("二级指针变量的地址%p 二级指针变量的值%p 二级指针变量的解引用%p 一级指针变量的地址%p 一级指针变量的值%p 一级指针变量的解引用%c\n", &FileNames, FileNames, *FileNames, &FileNames[i], FileNames[i], *FileNames[i]);
free(FileNames[i]);
}
printf("\n");
printf("二级指针变量的地址%p 二级指针变量的值%p 二级指针变量的解引用%p 一级指针变量的地址%p 一级指针变量的值%p 一级指针变量%s\n", &FileNames, FileNames, *FileNames, &FileNames[0], FileNames[0], FileNames[0]);
free(FileNames);
printf("二级指针变量的地址%p 二级指针变量的值%p 二级指针变量的解引用%p 一级指针变量的地址%p 一级指针变量的值%p 一级指针变量%s\n", &FileNames, FileNames, *FileNames, &FileNames[0], FileNames[0], FileNames[0]);
return;
}
head.h
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <dirent.h>
int GetDirFiles(char *FilePath, char ***FileNamesAddrs, int *FileNamAddrs);