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);
相关推荐
GalaxyPokemon27 分钟前
LeetCode - 53. 最大子数组和
算法·leetcode·职场和发展
乖乖是干饭王41 分钟前
Linux系统编程中的_GNU_SOURCE宏
linux·运维·c语言·学习·gnu
weixin_478689761 小时前
C++ 对 C 的兼容性
java·c语言·c++
hn小菜鸡1 小时前
LeetCode 1356.根据数字二进制下1的数目排序
数据结构·算法·leetcode
zhuiQiuMX1 小时前
分享今天做的力扣SQL题
sql·算法·leetcode
待什么青丝2 小时前
【TMS570LC4357】之相关驱动开发学习记录2
c语言·arm开发·驱动开发·单片机·学习
小柯博客2 小时前
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
c语言·stm32·单片机·嵌入式硬件·物联网
music&movie2 小时前
算法工程师认知水平要求总结
人工智能·算法
laocui13 小时前
Σ∆ 数字滤波
人工智能·算法
CodeWithMe3 小时前
【C/C++】namespace + macro混用场景
c语言·开发语言·c++