malloc为char ** foobar或char * foobar []分配,如何进行?

时间:2011-08-09 17:57:11

标签: c char malloc

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

4 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

#include <stdlib.h>

// void *calloc(size_t nelem, size_t elsize);

// ...
return calloc(n, sizeof(char *));

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

答案 2 :(得分:0)

为指针数组分配内存。

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

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

如果字符串不会被修改,你可以通过分配一个连续范围并将字符串放在那里来减少内存消耗,但基本上就是这样。

答案 3 :(得分:0)

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

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

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]