Свободная память массива->строки в структуре
В основном это мой код.
Это функция, которая получает статическую строку и одинокую букву и берет все слова, начинающиеся с этой одинокой буквы, и копирует их в динамическую строку в динамическом массиве типа struct. Я пытаюсь освободить память но она всегда выходит из строя не знаю почему
Что я уже пробовал:
#define _CRT_SECURE_NO_WARNINGS #include <stdlib.h> #include <stdio.h> #include <string.h> typedef struct string { char *string; int size; }String; String *array_string(char *string, char letter, int **size); void print_str(String *arr, int size); void free_str(String *arr, int size); void main() { String *arr; int *size; char letter; char string[500]; //Receiving static string from the user printf("Please enter a string\n"); rewind(stdin); gets(string); //Receiving one letter from the user to find matching words printf("Enter any letter:\n"); scanf_s("%c", &letter); printf("The string is:\n"); printf("%s \n", string); arr = array_string(string, letter, &size); //Printing the matching words and then freeing the memory print_str(arr, size); free_str(arr, size); printf("\nEnd.\n"); } String *array_string(char *string, char letter, int **size) { String *arr; int i = 0, j = 0, k = 0; int size_arr = 0; int size_str = 0; //Counting number of matching words in given string if (string[i] == letter || string[i] == toupper(letter) || string[i] == tolower(letter)) size_arr++; i++; for (; string[i] != '\0'; i++) if ((string[i - 1]) == ' ') if (string[i] == letter || string[i] == toupper(letter) || string[i] == tolower(letter)) size_arr++; //Allocating dynamic array of struct type for matching words in given string arr = (String*)malloc(size_arr * sizeof(String)); *size = size_arr; i = 0; //Counting number of letters in each matchin word and allocating dynamic string for each word if (string[j] == letter || string[j] == toupper(letter) || string[j] == tolower(letter)) { while (string[j] != ' ' && string[j] >= 'A' && string[j] <= 'z') { size_str++; j++; } arr[i].string = (char*)malloc(size_str * sizeof(char)); arr[i].size = size_str; size_str = 0; i++; } j++; while (i < size_arr) { for (; string[j] != '\0'; j++) if ((string[j - 1]) == ' ') if (string[j] == letter || string[j] == toupper(letter) || string[j] == tolower(letter)) { while (string[j] != ' ' && string[j] != '\0' && string[j] >= 'A' && string[j] <= 'z') { size_str++; j++; } arr[i].string = (char*)malloc(size_str * sizeof(char)); arr[i].size = size_str; size_str = 0; i++; } } i = 0; j = 0; //Copying the matching words to dynamic strings in dynamic array of struct type if (string[j] == letter || string[j] == toupper(letter) || string[j] == tolower(letter)) { while (string[j] != ' ' && string[j] >= 'A' && string[j] <= 'z') { arr[i].string[k] = string[j]; j++; k++; } arr[i].string[k] = '\0'; i++; k = 0; } j++; while (i < size_arr) { for (; string[j] != '\0'; j++) if ((string[j - 1]) == ' ') if (string[j] == letter || string[j] == toupper(letter) || string[j] == tolower(letter)) { while (string[j] != ' ' && string[j] != '\0' && string[j] >= 'A' && string[j] <= 'z') { arr[i].string[k] = string[j]; j++; k++; } arr[i].string[k] = '\0'; k = 0; i++; } } return arr; } //Print string void print_str(String *arr, int size) { int i; printf("The words are:\n"); for (i = 0; i < size; i++) printf("%s ", arr[i].string); printf("\n"); } //Free memory void free_str(String *arr, int size) { int i; for (i = 0; i < size; i++) free(arr[i].string); free(arr); }
Rick York
Ник: код относится к разделу "что я пробовал", а текст-к разделу "описание проблемы".