【问题标题】:malloc allocation for char **foobar or char *foobar[], how to proceed? [closed]char **foobar 或 char *foobar[] 的 malloc 分配,如何进行? [关闭]
【发布时间】:2011-08-09 17:57:11
【问题描述】:

我想知道当你有一个单词数组时如何分配内存(char **words 甚至 char *words[]。

【问题讨论】:

    标签: c char malloc


    【解决方案1】:

    你可以试试这个:

        char **words;
        words = malloc(sizeof(char)*MAX_WORD_SIZE*MAX_NUM_WORDS);
    
        if (words == 0)
        {
            printf("ERROR: Out of memory\n");
            return 1;
        }
                .... <use words>
        free(words);
    

    其中 MAX_WORD_SIZE 是您的字符串可能具有的最大长度(减去“\0”终止字符);和 MAX_NUM_WORDS 您希望管理的最大字数。

    上面的代码将分配内存来保存您想要管理的所有单词。

    你也可以使用calloc,它最大的好处就是将内存设置为“0”,这在处理字符串时非常有用:

        words = (char**)calloc(MAX_NUM_WORDS, sizeof(char)*MAX_WORD_SIZE);
    

    【讨论】:

    • 一个 malloc 转换在 C 中是多余的
    【解决方案2】:
    #include <stdlib.h>
    
    // void *calloc(size_t nelem, size_t elsize);
    
    // ...
    return calloc(n, sizeof(char *));
    

    使用calloc 可确保所有指针都以null 开头,而不是未初始化。

    【讨论】:

      【解决方案3】:

      您为指针数组分配内存。

      char** words = malloc(num_of_elements * sizeof(char*));
      

      然后,如果必须复制字符串,则为每个字符串分配内存并将分配的地址放入此数组。

      如果不修改字符串,您可以通过分配连续范围并将字符串放在那里来降低内存消耗,但基本上就是这样。

      【讨论】:

        【解决方案4】:

        首先,是平方分配吗?即每行中的元素数量是否相同?

        如果是,那么你可以使用简单的:

        char **words = calloc(rows * columns * sizeof(char *))
        

        然后访问每个项目@ COL,ROW 是这样的:

        words[ROW * columns + COL]
        

        如果它不是对称的,即每行有可变数量的列,那么你必须使用一些更复杂的东西。如果您有一个数组 cols[ROWS],其中包含逐行的每一列的大小,那么您需要:

        char **words = calloc(ROWS, sizeof(char **));
        for (int i = 0; i < ROWS; i++) {
            words[i] = calloc(cols[i], sizeof(char *));
        }
        

        您可以通过以下方式访问每个项目:

        words[ROW][COL]
        

        【讨论】:

          猜你喜欢
          • 2013-01-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-02-27
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多