C语言三级指针,目录下文件名称的收集

核心理论

  • 指针定义,只管单位大小。
  • 内存分配,要管连续性,和数量。
  • 几次分配就需要几次回收。

次要说教

  • 当main传递一个char **p 过来是,就是传递了一个地址过来,这个地址p一次就指向了 char ** (char ** 就是一个char *的数组)。文件名就得用char *,再套一层char *的地址数组。
  • char * 的内存是有大有小。
  • char ** 的内存都是8k。
  • 一堆连续的 char **就表示了一堆的文件名称。
  • 把这个char **的内存搞好了。
  • 再把这个 char **的值传回去就好了,这个charr ** 的值也是一个地址。

GetDirFiles.c

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);

        // int s = (sizeof(char *) * (FileCount + 1));
        // FileNames = (char **)realloc(FileNames, s);
        FileNames[FileCount++] = n;
    }
    closedir(datatrade_bak_dir);
    *FileNamesAddrs = FileNames;
    *FileNamAddrs = FileCount;
    
    return 0;
}

main.c

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]);
    }

    // 释放内存(重点:有几次molloc就应该有几次free)
    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

c 复制代码
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <dirent.h>

int GetDirFiles(char *FilePath, char ***FileNamesAddrs, int *FileNamAddrs);
相关推荐
二进制person4 小时前
Java SE--方法的使用
java·开发语言·算法
OneQ6664 小时前
C++讲解---创建日期类
开发语言·c++·算法
JoJo_Way4 小时前
LeetCode三数之和-js题解
javascript·算法·leetcode
码农不惑5 小时前
2025.06.27-14.44 C语言开发:Onvif(二)
c语言·开发语言
.30-06Springfield5 小时前
人工智能概念之七:集成学习思想(Bagging、Boosting、Stacking)
人工智能·算法·机器学习·集成学习
凌肖战6 小时前
力扣网C语言编程题:在数组中查找目标值位置之二分查找法
c语言·算法·leetcode
BreezeJuvenile7 小时前
数据结构与算法分析课设:一元多项式求值
c语言·课程设计·数据结构与算法分析·一元多项式计算
weixin_478689767 小时前
十大排序算法汇总
java·算法·排序算法
luofeiju7 小时前
使用LU分解求解线性方程组
线性代数·算法
SKYDROID云卓小助手8 小时前
无人设备遥控器之自动调整编码技术篇
人工智能·嵌入式硬件·算法·自动化·信号处理