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);

}
Другие вопросы по тегам