结构数组内存realloc stderr

当我将元素放入其中时,我试图重新分配一个结构数组,因为我将元素放入其中但我仍然收到一个realloc stderr。 struct数组最终将包含235,000个元素。 当我将初始起始大小设置为100,000时,我在尝试重新分配时收到stderr。 如果我将初始起始大小设置为300,000,则不会给出错误,因为它永远不会到达realloc语句。

#define _XOPEN_SOURCE #include  #include  #include  #include  #define BUFFERLEN 200 #define START_SIZE 100000 #define GROW 1000 #define TRUE 1 #define FALSE 0 typedef struct{ char *forw; char *back; } word; typedef struct{ char *entry; } single_words; FILE *words; /*-------------Function Prototypes------------*/ void reverse(char* string, char* revstr, int len); int search_struct(char* find, word* words, int length); int compare(const void* eventa, const void* eventb); int length(char* string); int main(void) { char *buffer; int letter_index[26]; char alpha[] = "abcdefghijklmnopqrstuvwxyz"; int i=0, found = FALSE, strlen=0, letter=0; word *word_storage; single_words *output_storage; int num_words = 0, size = 0; int num_output = 0, output_size = 0; /*buffer for the input strings of the words in the input file*/ buffer = (char*) malloc (sizeof(char)*BUFFERLEN); if(!buffer){ fprintf(stderr, "Error in buffer string mem alloc\n"); exit(1); } /*Initializing the array of structs to store the forward and reverse of each word*/ word_storage = (word*) malloc (sizeof(word)*START_SIZE); if(!word_storage){ fprintf(stderr, "Error in word_storage string mem alloc\n"); exit(1); } size = START_SIZE; /*Initializing the array of structs for the output*/ output_storage = (single_words*) malloc (sizeof(single_words)*START_SIZE); if(!output_storage){ fprintf(stderr, "Error in output_storage mem alloc\n"); exit(1); } output_size = START_SIZE; /*Set the letter index 0(which is a) to the first character*/ letter_index[0] = 0; words = fopen("words", "r"); /*Read the words(forward and reverse) in from stdin into the word_storage*/ while(fgets(buffer, BUFFERLEN, words) != NULL){ buffer = strtok(buffer, "\n"); strlen = length(buffer); if (num_words < size){ /*Allocate memory for the forward and reverse strings*/ word_storage[num_words].forw = (char *) malloc (sizeof(char) * strlen); if(!word_storage[num_words].forw){ free(word_storage[num_words].forw); fprintf(stderr, "word_storage forward string malloc was unsuccessful"); exit(1); } word_storage[num_words].back = (char *) malloc (sizeof(char) * strlen); if(!word_storage[num_words].back){ free(word_storage[num_words].back); fprintf(stderr, "word_storage forward string malloc was unsuccessful"); exit(1);; } /*Store the forward and reverse in the strings*/ strncpy(word_storage[num_words].forw, buffer, strlen); reverse(word_storage[num_words].forw, word_storage[num_words].back, strlen); printf("%d: %s %s\n", num_words, word_storage[num_words].forw, word_storage[num_words].back); /*Increment the letter if it changes*/ if(word_storage[num_words].forw[0] != alpha[letter]){ letter++; letter_index[letter] = num_words + 1; } num_words++; } else{ /*Increase the size of word_storage*/ word_storage = (word*) realloc (word_storage, sizeof(word) * size * GROW); if(!word_storage){ free(word_storage); fprintf(stderr, "Error in word_storage realloc string mem realloc\n"); exit(1); } size = size * GROW; } } return 0; } 

此处发生realloc错误:

 word_storage = (word*) realloc (word_storage, sizeof(word) * size * GROW); if(!word_storage){ free(word_storage); fprintf(stderr, "Error in word_storage realloc string mem realloc\n"); exit(1); } size = size * GROW; 

因此,您最初将size设置为START_SIZE ,即100,000。 然后当你使用它时,你尝试分配sizeof(word) * size * GROW字节。 sizeof(word)大概是16个字节; 我们知道size是100000,而GROW是1000.所以这足以容纳100,000,000个条目,其中你说你将使用235,000个。 这似乎有点慷慨的分配。

100,000,000个条目的总空间为1,600,000,000个字节。 这似乎很多,虽然现在许多台式机都可以处理。 但是realloc失败似乎并不令人惊讶。

也许你应该让GROW更合理,比如2。

顺便说一下,一旦你确定word_storage为NULL,就没有必要调用free(word_storage) 。 它没有坏处,因为free(NULL)是一个无操作,但它也没有好处,出于同样的原因。

您将大小乘以1000这是太多(高度指数增长1 – > 1000 – > 1000 000 – > 1000 000 000 …),并且您没有显示errno 。 我建议改为

  size_t newsize = 3*size/2 + 1000; word_storage = realloc(word_storage, sizeof(word)*newsize); if (!word_storage) { fprintf(stderr, "Cannot grow storage to %ld size, %s\n", (long) newsize, strerror(errno)); exit (EXIT_FAILURE); } else size = newsize; 

然后,如果从初始大小1000开始,你得到更合理的进展1000 – > 2500 – > 4750 – > 8125 – > 13187 – > 20780 …更重要的是你花费最多50%的无用记忆,不是近1000的因素!