Не удается освободить память, динамический массив строк - PullRequest
0 голосов
/ 25 мая 2019

Я написал функцию, которая должна получать строку и букву, и если буква является первой буквой слова, я должен вставить ее в динамически размещаемую строку.проблема была, когда я пытался освободить массив строк, которые я выделил, какие-либо предложения?

#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

char **split(char *string, char letter, int *size);
void printmatrix(char **str, int size);
void free_matrix(char **p, int  size);

void main() {
    char str[] ="Rony Goodman got a good mark";
    char ch,**p;
    int size;
    printf("Enter a small letter you are looking for:");
    scanf("%c", &ch);
    rewind(stdin);
    p=split(str, ch,&size);
    free_matrix(p, size);
    getch();
}

char ** split(char *string, char letter, int *size) {
    int count = 0, i = 0,num_of_words=0,j=0,t=0;
    char **str_arr;
    char *token;
    const char s[2] = { ' ' };

    token = strtok(string, s);
    if (token != NULL && tolower(token[0]) == letter) {
        count++;
        num_of_words++;
    }
    else {
        num_of_words++;
    }
    while (token != NULL) {
        token = strtok(NULL, s);
        if (token!=NULL && tolower(token[0]) == letter) {
            count++;
        }
        else {
            num_of_words++;
        }
    }
    //now we have the amount of the words inside the string;
    str_arr = (char**)malloc(sizeof(char*)*count);

    token = strtok(string, s);
    if (tolower(token) == letter) {
        str_arr[j] = (char*)malloc(strlen(token) * sizeof(char));
        strcpy(str_arr[j], token);
        j++;
    }
    while(i<num_of_words){
        token += strlen(token) + 1;
        if (tolower(token[0]) == letter) {
            str_arr[j] = (char*)malloc(strlen(token) * sizeof(char));
            strcpy(str_arr[j], token);
            j++;
            i++;
        }
        else {
            i++;
        }
    }
    *size = count;
    return str_arr;
}
void free_matrix(char **p,int  size){
    int i;
    for (i = 0; i < size; i++) {
        free(p[i]);
    }
    free(p);
}

по какой-то причине при отладке ничего не происходит, когда я вхожу в свободную строку (p [i]) ...

...