Одной из проблем, вызывающих неопределенное поведение, является
В void update_typeArray(char * char_array, int index, char input)
вы освобождаете память, указанную __array_buffer
, используя char_array
.
update_typeArray(__array_buffer, index, __char_buffer);
free(char_array);
и выделяетеновая память на char_array
char_array = (char*)malloc(sizeof(char)*(index + 1));//+1 cause string
, но ваш __array_buffer
будет по-прежнему указывать на освобожденную память.
и вы продолжите использовать __array_buffer
в main
после освобождения
compare_typeArray(__array_buffer,"a",size,blist);
free(__array_buffer)
Чтобы понять легко рассмотреть ниже фотографии.
---------------- -------
| __array_buffer | -------> | memory|
--------------- -------
после вызова update_typeArray(__array_buffer, index, __char_buffer);
---------------- -------
| __array_buffer | -------> | memory|
--------------- -------
^
|
----------------
| char_array |
---------------
после free(char_array);
----------------
| __array_buffer | -------> X
---------------
^
|
----------------
| char_array |
---------------
После char_array = (char*)malloc(sizeof(char)*(index + 1));//+1 cause string
----------------
| __array_buffer | -------> X
---------------
---------------- -------
| char_array | -----> | memory|
--------------- -------
Решение:
ЕслиВы хотите, чтобы __array_buffer
указывал на новую память. Вы используете указатель на указатель, как показано ниже.
void update_typeArray(char ** char_array, int index, char input)
, и вы вызываете update_type.
update_typeArray(&__array_buffer, index, __char_buffer);
ваш update_typeArray может выглядеть следующим образом.
void update_typeArray(char **char_array, int index, char input)
{
char * new_array = (char*)malloc(sizeof(char)*(index + 1));//+1 cause string
for (int i = 0; i <= index; i++)
{
if (i < index)
{
new_array[i] = (*char_array)[i];
}
if (i == index)
{
new_array[i] = '\0';//'\000' cause string
}
}
free(*char_array);
new_array[index - 1] = input;
*char_array = (char*)malloc(sizeof(char)*(index + 1));//+1 cause string
for (int i = 0; i <= index; i++)
{
if (i < index)
{
(*char_array)[i] = new_array[i];
}
if (i == index)
{
(*char_array)[i] = '\0';//'\000' cause string
}
}
free(new_array);
}