Malloc void return char 数组有时不起作用(Terry Davis 对 C++);



为什么这会导致VS中断,我认为这是因为指针__array_buffer在完成第三次调用后似乎update_typeArray是dealloc,但并非总是如此。 我不知道为什么。请帮助我 (这不是整个文件,但其余部分大部分被注释掉,没有影响( 如果我update_typeArray一个字符 * 并且 __array_buffer = 返回(return 将是 param 中传递__array_buffer的指针(,则不会发生这种情况。 我会这样做,但我希望超载。何でなの。请有人帮帮我。


#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] = '';//'00' 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] = '';//'00' 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] = '';
int index = 0;
bool chbuff_cyc = true;
int size;
while (chbuff_cyc)
{
char j[] = "reta";
char __char_buffer = j[index];//_getch();
if (__char_buffer == '')
{
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;
}

https://i.stack.imgur.com/sBZnB.jpg

导致未定义行为的问题之一是

void update_typeArray(char * char_array, int index, char input)您可以使用char_array释放__array_buffer指向的内存。

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仍将指向释放的内存。

释放后继续在main使用该__array_buffer

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] = '';//'00' 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] = '';//'00' cause string
}
}

free(new_array);
}

最新更新