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);
相关推荐
MobotStone5 分钟前
从问答到决策:Agentic AI如何重新定义AI智能体的未来
人工智能·算法
Shemol25 分钟前
二叉树的三种迭代遍历(无栈版本)-- 我在马克思主义课上的一些巧思
算法
胖咕噜的稞达鸭29 分钟前
进程状态,孤儿进程僵尸进程,Linux真实调度算法,进程切换
linux·运维·算法
RTC老炮1 小时前
webrtc降噪-WienerFilter源码分析与算法原理
算法·webrtc
hweiyu001 小时前
数据结构:数组
数据结构·算法
无限进步_2 小时前
C语言单向链表实现详解:从基础操作到完整测试
c语言·开发语言·数据结构·c++·算法·链表·visual studio
初夏睡觉2 小时前
循环比赛日程表 题解
数据结构·c++·算法
派大星爱吃鱼2 小时前
素数检验方法
算法
十五年专注C++开发2 小时前
libdatrie: 一个高效的 基于双数组字典树(Double-Array Trie)的C语言函数库
c语言·开发语言·trie
Greedy Alg3 小时前
LeetCode 72. 编辑距离(中等)
算法