не могу освободить динамическую матрицу - PullRequest
0 голосов
/ 26 мая 2019

Как часть моей домашней работы с C, я должен был сделать функцию, которая разбивает строку на все слова, начинающиеся со вставленного ключа (который является буквой).Все отлично работает, кроме функции free. Когда я пытаюсь освободить динамическую матрицу по функции (строки, а затем скелет), я получаю сообщение об ошибке, что программа сработала в точке останова.

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

char **Split(char *str, char letter, int *size);
void free_mat(char **mat, int size);

int main() {
    int size, i;
    char letter;
    char STR[100];
    char **strings_arr;
    printf("Please enter a string:\n");
    flushall;
    gets(STR);
    printf("Please enter a letter for a check:\n");
    letter = getchar();
    strings_arr = Split(STR, letter, &size);

    if (size > 0) {
        printf("The number of words that starts with the letter '%c' in the string '%s' is: %d\n\n", letter, STR, size);
    }
    printf("The words are:\n");
    for (i = 0; i < size; i++) {
        printf("%d . %s\n", i+1,strings_arr[i]);
    }
    free_mat(strings_arr, size);
    return 0;
}

void free_mat(char **mat, int size)  
{
    int i;
    for (i = 0; i < size; i++)
    {
        free(mat[i]);
    }
    free(mat);
}
char **Split(char *str, char letter, int *size) {
    int rows = 0, i, lengh = 0, j = 0, n = 0, m;
    char **strings_array;

    if ((str[0] == letter) || (str[0] == letter + 32) || str[0] == letter - 32) {
        rows++; 
    }
    for (i = 0; str[i] != '\0'; i++) {
         if (str[i] == ' ') {   
            if ((str[i + 1] == letter) || (str[i + 1] == letter + 32) || str[i + 1] == letter - 32) {
                rows++; 
            }
        }
    }
    if (rows == 0) {    
        printf("There are no words starting with '%c' letter in this string\n\n", letter);
    }
    i = 0;
    strings_array = (char*)malloc(rows * sizeof(char)); 
    if ((str[0] == letter) || (str[0] == letter + 32) || str[0] == letter - 32) { 
        while (str[i] != ' ' && str[i] != '\0') {
            lengh++;
            i++;
        }
        strings_array[j] = (char*)malloc((lengh + 1) * sizeof(char)); 
        for (n = 0; n < lengh; n++) {
            strings_array[j][n] = str[n];
        }
        strings_array[j][n] = '\0';
        j++;    
    }
    for (i = 1; str[i] != '\0'; i++) {
            if (letter == str[i] || letter == str[i] - 32 || letter == str[i] + 32) {
                lengh = 0;
                //k = 0;
                m = i;  
                while (str[m] != ' ' && str[m] != '\0') {
                    lengh++;
                    m++;
                }
                strings_array[j] = (char*)malloc(lengh + 1);    

                for (n = 0; n < lengh; n++) {
                    strings_array[j][n] = str[i++]; 
                }
                strings_array[j][n] = '\0';
                j++;    
            }
    }
    *size = rows;   // sends back the number of words by referance
    return strings_array;
}

Спасибо!

1 Ответ

0 голосов
/ 26 мая 2019

Точка останова - это то, что вы вручную вставляете в код из вашей IDE или аналога. Используется для отладки. Когда вы запускаете код, он предназначен для остановки, когда он достигает точки останова. Так что просто удалите точку останова, и она должна работать как положено.

Примечание. Удалить только точку останова. Не код в этой строке.

Вы упомянули в комментариях ниже, что используете Visual Studio 2015. Вот документация для точек останова в этом программном обеспечении: https://docs.microsoft.com/en-us/visualstudio/debugger/using-breakpoints?view=vs-2019

Но в вашем коде есть и другие вещи. Во-первых, использует fgets вместо . Во-вторых, вы, кажется, опубликовали неверную версию или что-то еще, потому что free_mat не скомпилируется. Тем не менее, это было легко решено путем изменения arr на mat.

Есть еще одна ошибка, о которой упоминал син в комментариях. Измените strings_array = (char*)malloc(rows * sizeof(char)) на strings_array = malloc(rows * sizeof(*strings_array)). Приведение не обязательно, вы выбрали неправильный тип аргумента для sizeof, и если вы передадите указатель с разыменованным типом вместо типа, вы в будущем избавите себя от множества проблем.

...