我想知道当你有一个单词数组(char ** words甚至char * words []时如何分配内存。
答案 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]