如何为存储在数组中的单词动态分配内存?
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;
}
我从屏幕上一个一个地输入单词,然后将它们发送到一个数组中。我当然可以立即为数组分配大内存,但我想为此动态分配内存。
例如我有一个数组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;
}