У меня возник вопрос о освобождении памяти, которую я выделил для массива struct в c.Чтобы освободить выделенную память для массива struct в c
У меня есть вопросы, которые были опубликованы, и ничто не прояснило мою проблему.
Прежде всего, я создал пару структур заранее; переменные внутри структуры имеют фиксированный размер, например char str[250]
или int
.
Я создал пару указателей на структуру и использовал malloc, чтобы превратить его как массив структуры.
Но когда я пытался освободить эти массивы структуры, он по какой-то причине не освободится.
Когда я проверяю утечку памяти через valgrind, он сказал мне, что я не могу освободить память, и я определенно потерял бы память на этих массивах структуры.
Ниже приведен фрагмент кода, который похож на мою структуру; метод моего malloc в моем массиве struct; и метод моей свободной памяти.
struct word{
char word[250];
int occurrence; };
struct same_word{
char word[250];};
int main(int argc, char** agrv){
FILE* fp;
fp = fopen(argv[1],"r");
if(fp == NULL)
{
perror("File does not open.");
exit(0);
}
int total_number_of_word = /*number of word I have in my txt file*/
int total_number_of_same_word = /*number of same word I have in my txt file*/
/* Assuming I knew these two numbers in advance*/
struct word* essay = malloc(total_number_of_word * sizeof(struct word));
struct same_word* unique_word = malloc(total_number_of_same_word * sizeof(struct same_word));
int index = 0;
int index2 = 0;
int ret = 0;
while(index < total_number_of_word){
fscanf(fp,"%s",essay[index].word);
essay[index].occurrence = 1;
ret = strcmp(essay[index].word,"Hello");
if(ret == 0)
{
strcpy(unique_word[index2].word,essay[index].word);
index2++;
}
index++;
}
free(essay);
free(unique_word);
fclose(fp);
}
Спасибо заранее.
P.S Спасибо всем, кто указал на ошибки, которые у меня есть в моем вопросе.
Является ли это минимальным, полным, проверяемым примером? (Я думаю, нет, поскольку это бесконечный цикл) – immibis
Seconding immibis; если вы хотите добавить только «i ++» внутри цикла while, это определенно выглядит так, как будто оно должно работать. Попробуйте сделать минимальный пример, с которым вы можете скомпилировать и запустить и увидеть то же поведение. –
вы проверяете shoud, если указатель на выделенную память не равен NULL. Кроме того, если вы измените значение указателя в цикле, например, эссе ++, вы не сможете освободить его. – qleguennec