Как получить доступ к памяти динамического 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 шт):
постоянно выдает ошибку с проблемой с памятью
Для начала, надо бы привести текст этой ошибки. Телепатов тут нет.
Ну а по сути - сообщение о проблемах с памятью, как правило, имеют под собой всего две причины:
- Выход за границы индекса при работе с массивами
- Использование не инициализированного указателя.
Если Вам некогда разбираться со своим кодом, то самый простой путь - скомпилировать программу с ключом -g для работы с отладчиком и запустить из под отладчика:
gcc -g main.c -o main
gdb main
После этого, запускаете программу на выполнение командой отладчика run и, после того как она упала, даёте команду распечатки трека backtrace