如何正确地重新分配一个字符串数组?

How to properly reallocate an array of strings?

这似乎是一个简单的问题,也可能是一个简单的答案,但我正在尝试从文本文件中读取单词并将每个单词分配给动态分配的字符串数组:

char** words = calloc(8, sizeof(char*));

(必须这样分配)

然后我必须根据需要调整数组的大小。当我尝试对数组使用 realloc() 时,我的问题就来了。我是这样做的:

if(index == MAX-1){ // reallocate if needed
    words = (char**) realloc(words, sizeof(*words)*2); MAX*=2;
    printf("Re-allocated %lu character pointers.\n", MAX);
}

其中 MAX 是数组中可以存储的最大元素数。

我的数组填充了正确的值,但是当调用 realloc 时,一些字符串似乎丢失了!几个索引不再填充,并且在尝试打印数组时出现内存错误,因为它们不知何故丢失了。

下面是我如何分配字符串并将它们存储在索引处:

words[index] = malloc(strlen(temp)+1);
words[index] = strdup(temp); // copy the word over using strdup

怎么了?

对于初学者来说,这个代码片段

words[index] = malloc(strlen(temp)+1);
words[index] = strdup(temp); // copy the word over using strdup

产生内存泄漏。你应该马上写

words[index] = strdup(temp); // copy the word over using strdup

此声明

words = (char**) realloc(words, sizeof(*words)*2); MAX*=2;

只分配两个char *.

类型的指针

你至少应该写

MAX*=2;
words = (char**) realloc(words, sizeof(*words)*MAX); 

另外if语句中的条件应该是

if(index == MAX){

而不是

if(index == MAX-1){

如果您使用的是 MAX 的值,那么为什么要使用幻数 8

char** words = calloc(8, sizeof(char*));