как я должен освободить массив указателей на строку? - PullRequest
0 голосов
/ 28 августа 2018

Я включаю весь код, поэтому, если у вас есть какие-либо комментарии, я хотел бы узнать!

Функция получает строку и создает массив строковых указателей; каждая строка содержит слово, которое начинается с выбранной буквы.

Моя проблема в том, что при функции free_string() я получаю ошибку!

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

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

void main()
{
    char str[SIZE],leteer,**string;
    int size=0;
    printf("please enter the string\n");
    gets(str);
    printf("please enter the letter\n");
    scanf("%c",&leteer);
    string=create_strings_from_letter(str, leteer, &size);
    print_string(string,size);
    free_string(string,size);
}

char ** create_strings_from_letter(char *str, char letter, int * size)

{

    char **string_of_letters;
    char *read = str,*write;
    int count=0,i=0;
    while (*read)//cheaking how much strings to allocate//
    {
        if (*read == tolower(letter)|| *read == toupper(letter))
        {
            (*size)++;
            for (; *read && *read != ' '; read++);
        }
        for (; *read && *read != ' '; read++);
        read++;
    }
    string_of_letters = (char**)malloc((*size)*sizeof(char*));
    read = str;
    while (*read)
    {
        for (; *read && *read != tolower(letter) && *read != toupper(letter);read++);
        if (*read)
        {
            write = read;
            for (; *read && *read != ' '; read++, count++);
            string_of_letters[i] = (char*)malloc((count) * sizeof(char));
            strncpy(string_of_letters[i], write,count);
            string_of_letters[i][count] = '\0';
            count = 0;
            i++;
        }
        else
            break;
    }
    return string_of_letters;


}

void free_string(char ** string, int size)

{

    int i;
    for (i = 0;i<size; i++)
        free(string[i]);

    free(string);
}

1 Ответ

0 голосов
/ 01 сентября 2018

По комментариям вы, похоже, нашли источник вашей ошибки, которая заключается в записи в адрес памяти, который находится за пределами. Поэтому я хочу ответить на ваш другой вопрос в комментариях.

что беспокоит, что он не предупредил меня о превышении пределов массива, почему это так?

Это будет зависеть от установленных вами параметров компилятора. Некоторые компиляторы имеют опции для установки уровня предупреждения и уровня оптимизации. Если вы сделаете это, предупреждение можно увидеть.

Например, в случае GCC, если для параметра уровня предупреждения установлено значение -Wall (Многие), а для уровня оптимизации - -O2 (Полный), вы получите предупреждение при попытке записи в адрес за пределами памяти.

Предупреждение будет примерно таким:

warning: array subscript is above array bounds [-Warray-bounds]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...