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);
相关推荐
Gorway3 小时前
解析残差网络 (ResNet)
算法
拖拉斯旋风3 小时前
LeetCode 经典算法题解析:优先队列与广度优先搜索的巧妙应用
算法
Wect3 小时前
LeetCode 207. 课程表:两种解法(BFS+DFS)详细解析
前端·算法·typescript
灵感__idea17 小时前
Hello 算法:众里寻她千“百度”
前端·javascript·算法
Wect1 天前
LeetCode 130. 被围绕的区域:两种解法详解(BFS/DFS)
前端·算法·typescript
NAGNIP2 天前
一文搞懂深度学习中的通用逼近定理!
人工智能·算法·面试
颜酱2 天前
单调栈:从模板到实战
javascript·后端·算法
CoovallyAIHub2 天前
仿生学突破:SILD模型如何让无人机在电力线迷宫中发现“隐形威胁”
深度学习·算法·计算机视觉
CoovallyAIHub2 天前
从春晚机器人到零样本革命:YOLO26-Pose姿态估计实战指南
深度学习·算法·计算机视觉
CoovallyAIHub2 天前
Le-DETR:省80%预训练数据,这个实时检测Transformer刷新SOTA|Georgia Tech & 北交大
深度学习·算法·计算机视觉