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);
相关推荐
CoderCodingNo7 小时前
【NOIP】2011真题解析 luogu-P1003 铺地毯 | GESP三、四级以上可练习
算法
iFlyCai7 小时前
C语言中的指针
c语言·数据结构·算法
查古穆8 小时前
栈-有效的括号
java·数据结构·算法
再一次等风来8 小时前
近场声全息(NAH)仿真实现:从阵列实值信号到波数域重建
算法·matlab·信号处理·近场声全息·nah
汀、人工智能8 小时前
16 - 高级特性
数据结构·算法·数据库架构·图论·16 - 高级特性
大熊背8 小时前
利用ISP离线模式进行分块LSC校正的方法
人工智能·算法·机器学习
XWalnut8 小时前
LeetCode刷题 day4
算法·leetcode·职场和发展
蒸汽求职8 小时前
机器人软件工程(Robotics SDE):特斯拉Optimus落地引发的嵌入式C++与感知算法人才抢夺战
大数据·c++·算法·职场和发展·机器人·求职招聘·ai-native
AI成长日志9 小时前
【笔面试算法学习专栏】双指针专题·简单难度两题精讲:167.两数之和II、283.移动零
学习·算法·面试
旖-旎9 小时前
分治(库存管理|||)(4)
c++·算法·leetcode·排序算法·快速选择算法