malloc void возвращать массив символов иногда не работает (Терри Дэвис был прав насчет C++);
Почему это вызывает разрыв в VS, я предполагаю, что это так, потому что указатель __array_buffer, по-видимому, не имеет значения после завершения update_typeArray вокруг третьего вызова, но не всегда. Понятия не имею почему. пожалуйста, помогите мне (это не весь файл, но остальное в основном закомментировано и никак не влияет) этого не произойдет, если я сделаю update_typeArray как char * и __array_buffer = return (return будет указателем на __array_buffer, переданный в параметре). Я бы сделал это, но я надеялся на перегрузку. Someone でなの。пожалуйста, кто-нибудь, помогите мне.
#include <iostream>
#include <Windows.h>
#include <thread>
#include <chrono>
#include <cmath>
#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <conio.h>
//winigga stuff
# define VT100_WinAPI \
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);\
DWORD dwMode = 0;\
GetConsoleMode(hOut, &dwMode);\
dwMode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING;\
SetConsoleMode(hOut, dwMode);
//////////////////////////////////////////////////////////////////
/*
Increment before use if index is 0 from init, (Char)array must contain a single value, and will recive '/0'.
Size of array is calculated by overloads input type and index (with null terminater taken in to account).
*/
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);
}
/*
Increment before use if index is 0 from init, (Int)array must contain a single value.
Size of array is calculated by overloads input type and index.
*/
//Debug
/*
void update_typeArray(int * int_array, int index, int input)
{
int * new_array = (int*)malloc(sizeof(int)*(index));
for (int i = 0; i < index; i++)
{
new_array[i] = int_array[i];
}
free(int_array);
new_array[index - 1] = input;
int_array = (int*)malloc(sizeof(int)*(index));
for (int i = 0; i < index; i++)
{
int_array[i] = new_array[i];
}
free(new_array);
}
*/
int main()
{
VT100_WinAPI
while (!(GetKeyState(0x1B) & 0x8000))
{
if (_kbhit()||true)
{
char * __array_buffer = (char*)malloc(sizeof(char)); __array_buffer[0] = '\0';
int index = 0;
bool chbuff_cyc = true;
int size;
while (chbuff_cyc)
{
char j[] = "reta";
char __char_buffer = j[index];//_getch();
if (__char_buffer == '\0')
{
chbuff_cyc = false;
size = index;
}
else
{
++index;
update_typeArray(__array_buffer, index, __char_buffer);
}
}
if (size > 0)
{
bool * blist = (bool*)malloc(size);
//-----------|searchCommand (Start)|------------
if (size == StringSize("a"))
{
compare_typeArray(__array_buffer,"a",size,blist);
if(checkem(blist,size,and))
{
_putch('a');
}
}
//-----------|searchCommand (End)|------------
free(blist);
}
free(__array_buffer);
}
}
return 0;
}
1 ответ
Одной из проблем, вызывающих неопределенное поведение, является
В 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);
}