Говорю сразу же, не надо говорить вот при помощи этой функции лучше, сделай так. Мне нужно сделать то что я делаю с помощью функций malloc и realloc, динамически выделяя память. Вариант с одноразовым выделением максимального количества памяти не работает. Такую задачу передо мной поставил преподаватель.
Вопрос вот в чём: при переходе к этой строке
text[s]=(char*)realloc(text[s], (y + 1) * sizeof(char));
выдаёт ошибку:
Вызвано исключение по адресу 0x0FFBA76D (ucrtbased.dll) в Kursovaya_2.1.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0xCDCDCDC4.
Могу предположить, что лезет не в ту память...
На освобождение памяти пока не смотрите этого я ещё не реализовал и я не думаю что моя программа потребует её столько, что уже на этом этапе не хватает.
Вот задача которая передо мной стоит:
Ввести строку символов разделителей. (тут же приходится учесть подсчёт различных элементов в этой строке. это понадобится дальше по заданию)
Затем вводится число и массив строк с неизвестным количеством строк. Ввод текста заканчивается если вов введённой строке количество различных символов разделителей окажется равным заданному числу (то которое мы ввели выше).
Вот мой код. Всё до строки которую я указал выше работает исправно.
#include "pch.h"
#include
#include
int main()
{
setlocale(LC_ALL, "Russian");
char*str_razd = NULL;
int schetch_1 = 0;
int i = 0, j = 0, k = 0;
printf("Пожалуйста введите строку разделителей\n");
do
{
str_razd = (char*)realloc(str_razd, (i + 1) * sizeof(char));
str_razd[i] = getchar();
i++;
k++;
} while (str_razd[i - 1] != '\n');
for (i = 0; i < k; i++)//
{
if (i != 0) {
for (j = 0; j < i; j++)
{
if (str_razd[i] == str_razd[j])
{
break;
}
if (j == i - 1)schetch_1++;
}
}
else
{
schetch_1++;
}
}
schetch_1--;//
printf("%d", schetch_1);
str_razd[i] = '\0';
//free(array);
int chisl;
printf("Пожалуйста введите число\n");
scanf_s("%d", &chisl);
char**text = NULL;
char*vsp_mass = NULL;
int schetch_2 = 0;
i = 0;
int f = 0, s = 0, y = 0, kolvo = 0;
int e;
char x = 0;
do
{
for (; kolvo < chisl;)
{
text = (char**)realloc(text, (s + 1) * sizeof(char*));
for (; x != '\n';)
{
text[s]=(char*)realloc(text[s], (y + 1) * sizeof(char));
text[s][y] = getchar();
x = text[s][y];
if (text[s][y] == str_razd[i])
{
e = 0;
if (kolvo == 0)
{
vsp_mass = (char*)realloc(vsp_mass, (e + 1) * sizeof(char));
vsp_mass[e] = text[s][y];
kolvo++;
}
else
{
for (;e <= kolvo;)
{
if (e < kolvo)
{
if (text[s][y] != vsp_mass[e]) e++;
}
vsp_mass[e] = text[s][y];
kolvo++;
if (kolvo < chisl)
{
y++;
i = 0;
}
else text[s][y] = '\0';
//return
}
}
}
else if (i < k)
{
i++;
}
else
{
y++;
i = 0;
}
}
text[s][y] = '\0';
s++;
f++;
free(vsp_mass);
}
i++;
} while (str_razd[i - 1] != '\n');
str_razd[i] = '\0';
return 0;
}
буду очень ждать комментариев, что не так. Говорю сразу я студент 1 курса (язык С мы проходи первый семестр). Так что на отличное знание языка не рассчитывайте
Другие языки программирования и технологии
Выделение памяти в C
Сразу после
text = (char**)realloc(text, (s + 1) * sizeof(char*));
добавь:
text[s] = NULL;
У тебя же в text[s] неизвестно что (malloc/realloc не обнуляют выделяемую память). И к этому неизвестно чему ты тремя строчками ниже применяешь realloc.
text = (char**)realloc(text, (s + 1) * sizeof(char*));
добавь:
text[s] = NULL;
У тебя же в text[s] неизвестно что (malloc/realloc не обнуляют выделяемую память). И к этому неизвестно чему ты тремя строчками ниже применяешь realloc.
Кхм... Мне кажется проблема в том, что ты присваиваешь адрес нового блока элементу из старого блока. А realloc не malloc, он может переместить новый блок в другое место памяти (кучи), заполнив его начало старым значением блока. Понимаешь? Тогда адресация запутается. Наверное поэтому компилятор не допускает таких выражений.
И да! Вот никогда не лишне будет проверять что вернул realloc. А что если он не смог добавить достаточный блок и вернул нулевой указатель?
И да! Вот никогда не лишне будет проверять что вернул realloc. А что если он не смог добавить достаточный блок и вернул нулевой указатель?
If ptr is a null pointer, realloc() shall be equivalent to malloc() for the specified size.
If ptr does not match a pointer returned earlier by calloc(), malloc(), or realloc() or if the space has previously been deallocated by a call to free() or realloc(), the behavior is undefined.
Соответственно,
text[s] = NULL;
text[s] = realloc(text[s], (y + 1) * sizeof(char));
должно решить проблему.
Явное приведение void* от malloc/realloc к нужному типу в си не требуется. Не надо засорять им код.
If ptr does not match a pointer returned earlier by calloc(), malloc(), or realloc() or if the space has previously been deallocated by a call to free() or realloc(), the behavior is undefined.
Соответственно,
text[s] = NULL;
text[s] = realloc(text[s], (y + 1) * sizeof(char));
должно решить проблему.
Явное приведение void* от malloc/realloc к нужному типу в си не требуется. Не надо засорять им код.
"Говорю сразу же, не надо говорить вот при помощи этой функции лучше"
а я и не собирался другую функцию советовать.
я посоветую сразу другой язык. если надо, то другого препода.
не все люди терпят полумеры
а я и не собирался другую функцию советовать.
я посоветую сразу другой язык. если надо, то другого препода.
не все люди терпят полумеры
Похожие вопросы
- Выделение памяти и обращение к элементам C++
- Язык си, не могу понять динамическое выделение памяти.
- требуется помощь специалистов. Ребята что мне сделать с компьтером чтобы объединить память диска C и D
- Напишите пожалуйста примеры функций выделения памяти и освобождения памяти (с аргументами) в С++ ?
- Вопрос для людей, знающих С/С++ -динамическое выделение памяти
- Помогите с решением задач по С по теме "Динамическое выделение памяти"!
- c++ new\delete: смысл выделения и освобождение памяти для озу из самой же озу?
- люди помогите как увеличить память на диске C
- Подскажите пожалуйста, почему уменьшается память на дисках C и D
- Удаляю ненужные программы с диска C, остается памяти 100мб. комп поработает пол часа память заканчивается, хотя ничего..
https://ideone.com/lJI5Cr