您需要为字符串分配空间。Malloc 返回一个具有您想要的大小的内存槽,但不允许内存重新分配。为此,您有realloc。
使用 malloc,您最终会得到一个固定大小的表,就像您只声明它具有静态但稍后初始化一样(好吧,我有点反对这句话,因为 malloc 远不止于此,但对于这个目的可以安全地说出来)。
Realloc 会这样做,重新分配内存,但如果你没有正确使用 i ,它可能会非常危险。而且,在我看来,这不是最正确的方法。
当你想保存一些你不知道大小的东西时,动态结构是要走的路。您可以使用“类似链接列表”的数据结构,这样您就可以拥有任意数量的单词,然后将该列表转换为数组。
我会用这样的东西:
typedef struct _words{ //Structure to the dynamic insertion of words
char *word;
struct _words *next;
}words;
words *last; //Easier implementation for this case. Not always the best solution
words *init(){ //Is good practice to start with an empty structure for reference passing
words *new = malloc(sizeof(words));
if(new == NULL) exit(0);
new->next = NULL; //A good end/next reference
return new;
}
void insertWord(char *word){
words *new = malloc (sizeof(words));
if(new == NULL) exit(0);
new->word = malloc(strlen(word)*sizeof(char));
if(new->word == NULL) exit(0);
new->next = NULL; //Or new->next = last->next; wich is also null.
last->next = new;
last = new;
}
int main(){ //Or the name of your function
FILE *file = fopen ( filename, "r" );
words *list = init();
last = list;
if ( file != NULL )
{
char line [ 128 ]; /* or other suitable maximum line size */
int i = 0;
while ( fgets ( line, sizeof line, file ) != NULL ) /* read a line */
{
insertWord(line);
i++;
}
//Here, you already have all the words in your dynamic structure. You can now save them into an array
char **array = malloc(i*sizeof(char*)); //i is the number of words.
if(array == NULL) exit(0);
word *aux = list->next;
if(aux != NULL){
for(int j=0;j<i && aux != NULL;j++){
array[j] = malloc(strlen(aux->word)*sizeof(char));
if(array[j] == NULL) exit(0);
strcpy(array[j], aux->word);
aux = aux->next; // jump to the next word
}
}
...
}
我认为这可能有效,但我没有尝试过。只是为了让您了解如何实现动态结构。
它错过了释放并且不是实际的堆栈,即使是关闭的。
希望这可以帮助。