如何为存储在数组中的单词动态分配内存?

How to dynamically allocate memory for words stored in an array?

我从屏幕上一个一个地输入单词,然后将它们发送到一个数组中。我当然可以立即为数组分配大内存,但我想为此动态分配内存。

例如我有一个数组words。首先,我为它分配了一点内存 char *words = malloc(capacity) ,例如 capacity = 15 。 ...从屏幕上输入单词...。所有分配的内存都已满,我分配更多内存用于进一步的工作 char *tmp = realloc(words, capacity*2)。可能,我了解它是如何工作的。但是我不知道怎么写。也就是如何把这些词输入到一个数组中。你能详细描述一下我应该怎么做吗?

示例:

我从屏幕上输入单词 side left ball rich 最后我得到一个数组 *arr = ["side", "left", "ball", "rich"]

您需要一个指针数组,其中每个索引存储一个单词。 还要注意释放内存

片段如下,

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main()
{
    int size = 3;
    char word[30];
    
    char **word_list =  malloc(sizeof(word_list) * size);
    
    printf("Enter %d Words\n",size);
    
    for(int i =0; i<size; ++i){
    
        scanf("%30s",word);
        
        int word_size = strlen(word)+1;
        
        word_list[i] = malloc(word_size);
        
        strncpy(word_list[i],word,word_size);
    }
    
    printf("\nEntered words are\n");

    for(int i=0; i<size; ++i){
        printf("%s ",word_list[i]);
    }
    
    
    //resizing the capacity of the array
    {
        int resize;
        printf("\nresize array size to: ");
        scanf("%d",&resize);
        
        if(size<resize){
            for(int i=size-1; i>=resize; --i)
                free(word_list[i]);
        }        
        
        word_list = realloc(word_list, sizeof(word_list) * resize);
        
        if(resize > size)
            printf("Enter %d Words \n",resize-size);
        
        for(int i =size; i<resize; ++i){
        
            scanf("%30s",word);
            
            int word_size = strlen(word)+1;
            
            word_list[i] = malloc(word_size);
            
            strncpy(word_list[i],word,word_size);
        }
        
        size = resize;
    }
    
    printf("Current words are\n");
    for(int i=0; i<size; ++i){
        printf("%s ",word_list[i]);
    }
    
    
    //Memory deallocation
    for(int i=0; i<size; ++i){
        free(word_list[i]);
    }
    
    free(word_list);
    
    
    return 0;
}

DEMO