malloc void возвращать массив символов иногда не работает (Терри Дэвис был прав насчет C ++); - PullRequest
0 голосов
/ 19 сентября 2018

почему это вызывает разрыв в 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;
}

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

1 Ответ

0 голосов
/ 19 сентября 2018

Одной из проблем, вызывающих неопределенное поведение, является

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

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...