Как получить доступ к памяти динамического 2D массива?

Как решить ошибку в этой задаче? Вводится строка del. Затем вводится число num. Затем вводятся строки текста то тех пор пока в строке не будет num различных символов из строки del. не могу понять почему не работает. постоянно выдает ошибку с проблемой с памятью.

void STRINGINPUT(char *a, int id);
int ONESYM(char *a, int b, int dsize, char *del);

int main() {

    int dsize, num = 0, y = 0;
    char *del = NULL;
    char *mas = NULL;
    char **text = NULL;

    //ввод строки
    printf("Enter delimeters: ");
    del = (char*)malloc(1*sizeof(char));
    STRINGINPUT(del, 0);
    dsize = strlen(del);
    del = (char *)realloc(del, dsize * sizeof(char));
    del[dsize] = 0;
    puts(del);

    //ввод числа
    while (num == 0 || num > dsize) {
        scanf_s("%d", &num);
    }

    //ввод текста
    for (int yhit = 0; yhit == 0; y++) {
        printf("String %d: ", y + 1);
        mas = (char*)malloc(1 * sizeof(char));
        STRINGINPUT(mas, 1);
        int x = strlen(mas);
        for (int i = 0, hit = 0; i <= dsize; i++) {
            for (int xhit = 0; xhit < x; xhit++) {
                if (mas[xhit] == del[i]) {
                    xhit = strlen(mas);
                    hit++;
                }
            }
            if (hit == num) yhit++;
        }
        x = ONESYM(mas, x, dsize, del);
        text = (char**)realloc(text, (y + 1) * sizeof(char*));
        text[y] = (char*)malloc((x + 1) * sizeof(char));
        for (int i = 0; i <= x; i++) {
            text[y][x] = mas[x];
        }
        puts(text[y]);
        mas = NULL;
    }
    printf("\n");

    for (int i = 0; i < y; i++) {
        puts(text[y]);
    }

    return 0;
}

void STRINGINPUT(char *a, int id) {
    rewind(stdin);
    int i = 0, hit = 0, x, xhit;
    for (i = 0; hit == 0; i++) {
        a = (char*)realloc(a, (i+1)*sizeof(char));
        a[i] = getc(stdin);
        if (a[i] == '\n') hit++;
        if (id == 0) {
            for (x = 0, xhit = 0; xhit == 0 && x < i; x++) {
                if (a[i] == a[x]) {
                    xhit++;
                    i--;
                }
            }
        }
    }
    a[i-1] = 0;
}

int ONESYM(char *a, int b, int dsize, char *del) {
    int s = 0, i, hit;
    for (i = 0, hit = 0; hit == 0; i++) {
        if (a[i] == 0) hit++;
        int ss = s;
        for (int j = 0; j < dsize; j++) {
            if (a[i] == del[j]) s++;
        }
        if (ss == s) s = 0;
        if (s != 1 && s != 0) {
            for (int k = i; k < b; k++) {
                a[k] = a[k + 1];
            }
            i--;
        }
    }
    return i;
}

Ответы (1 шт):

Автор решения: Sergey

постоянно выдает ошибку с проблемой с памятью

Для начала, надо бы привести текст этой ошибки. Телепатов тут нет.

Ну а по сути - сообщение о проблемах с памятью, как правило, имеют под собой всего две причины:

  1. Выход за границы индекса при работе с массивами
  2. Использование не инициализированного указателя.

Если Вам некогда разбираться со своим кодом, то самый простой путь - скомпилировать программу с ключом -g для работы с отладчиком и запустить из под отладчика:

gcc -g main.c -o main
gdb main

После этого, запускаете программу на выполнение командой отладчика run и, после того как она упала, даёте команду распечатки трека backtrace

→ Ссылка