【问题标题】:C how to determine how much memory a char** occupiesC如何判断一个char**占用多少内存
【发布时间】:2018-03-07 16:14:48
【问题描述】:

下面的代码将文件名存储在一个目录中作为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]);
    }
}

【问题讨论】:

  • malloc() 一个已知的字节数,那么你为什么不跟踪它呢?此外,除非您 100% 确定要将 ALL 元素初始化为 0,或者您真的知道自己在做什么,否则不要使用 calloc()。跨度>

标签: c pointers memory heap-memory


【解决方案1】:

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

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

在所有情况下,您都需要约定。最好明确它们,至少在 cmets 中。

顺便说一句,callocmalloc 可能会失败(通过返回 NULL)。你应该经常检查。

【讨论】:

    【解决方案2】:

    你知道你有多少个文件名。您可以使用strlen 来查找每个字符串的长度。字符串的实际最小分配长度是空终止符的 strlen + 1。如果您打算将所有文件名复制到一个长字符串中,您可能不希望在每个文件的末尾都有一个空终止符(这不会是单个 C 风格的字符串),但您可能需要其他类型的的分隔符,您必须包括其长度。

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

    【讨论】:

      猜你喜欢
      • 2017-02-06
      • 1970-01-01
      • 2011-01-24
      • 2021-11-18
      • 1970-01-01
      • 2010-09-19
      • 2012-02-13
      • 2015-10-13
      • 2023-04-07
      相关资源
      最近更新 更多