C如何确定char **占用多少内存

时间:2017-09-26 12:22:07

标签: c pointers memory heap

下面的代码将文件名作为char**存储在目录中 - 名为files。最终,我需要将所有这些文件名存储在一个char*中。所以我认为我逻辑上需要做的第一件事是找出这些字符串数组占用多少内存,然后分配这个大小的char*。我对从堆技术中分配不是很熟悉。如何确定char**占用多少内存?

#include <string.h>
#include <stdio.h>
#include <dirent.h>
#include <malloc.h>

size_t file_list(const char *path, char ***ls) {
    size_t count = 0;
    size_t length = 0;
    DIR *dp = NULL;
    struct dirent *ep = NULL;

    dp = opendir(path);
    if(NULL == dp) {
        fprintf(stderr, "no such directory: '%s'", path);
        return 0;
    }

    *ls = NULL;
    ep = readdir(dp);
    while(NULL != ep){
        count++;
        ep = readdir(dp);
    }

    rewinddir(dp);
    *ls = calloc(count, sizeof(char *));

    count = 0;
    ep = readdir(dp);
    while(NULL != ep){
        (*ls)[count++] = strdup(ep->d_name);
        ep = readdir(dp);
    }

    closedir(dp);
    return count;
}

int main(int argc, char **argv) {

    char **files;
    size_t count;
    int i;

    count = file_list("/home/rgerganov", &files);
    for (i = 0; i < count; i++) {
        printf("%s\n", files[i]);
    }
}

2 个答案:

答案 0 :(得分:2)

没有可移植的方法来获取malloc指针所指向的内存区域所需的大小。

您需要明确管理和跟踪这些尺寸。一种可能的方法是让一些struct包含它们(或者将该大小保留在别处,或者重新计算它)。您甚至可以使用flexible array member结束struct

在所有情况下,您都需要约定。更好地明确它们,至少在评论中。

BTW,callocmalloc可能会失败(通过返回NULL)。你总是应该检查一下。

答案 1 :(得分:0)

您知道有多少个文件名。您可以使用strlen查找每个字符串的长度。对于null终止符,字符串的实际最小分配长度是strlen + 1。如果您计划将所有文件名复制到一个长字符串,您可能不希望在每个文件的末尾都有一个空终结符(不会是一个C样式的字符串),但您可能还需要其他类型的字符串分隔符,你必须包括它的长度。

所以你会遍历字符串,总结长度。每个所需的长度是strlen + <length of delimiter>(可能跳过最后一个字符串的分隔符。