【发布时间】:2011-08-09 17:57:11
【问题描述】:
我想知道当你有一个单词数组时如何分配内存(char **words 甚至 char *words[]。
【问题讨论】:
我想知道当你有一个单词数组时如何分配内存(char **words 甚至 char *words[]。
【问题讨论】:
你可以试试这个:
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);
【讨论】:
#include <stdlib.h>
// void *calloc(size_t nelem, size_t elsize);
// ...
return calloc(n, sizeof(char *));
使用calloc 可确保所有指针都以null 开头,而不是未初始化。
【讨论】:
您为指针数组分配内存。
char** words = malloc(num_of_elements * sizeof(char*));
然后,如果必须复制字符串,则为每个字符串分配内存并将分配的地址放入此数组。
如果不修改字符串,您可以通过分配连续范围并将字符串放在那里来降低内存消耗,但基本上就是这样。
【讨论】:
首先,是平方分配吗?即每行中的元素数量是否相同?
如果是,那么你可以使用简单的:
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]
【讨论】: