Windows сработала точка останова в c?

0

Диалоговое окно появляется, когда выполнение во время выполнения достигает в инструкции free (dat)

Windows вызвала точку останова в файле project.exe. Это может быть связано с повреждением кучи, что указывает на ошибку в файле project.exe или на любую из загруженных DLL файлов.

while(1)
{
    char *dat;

    std::cout<<"Enter command\n";
    memset(command, 0, 30);
    std::cin>>command;
    m_size = strlen(command)+2;
    printf("send data Size: %d\n",m_size);
    command[m_size-2] = '\r';
    dat = (char*)malloc(m_size);
    if(!dat)
    {
        printf("mem allocation failed");
    }
    else
    {
        memcpy(dat,command,sizeof(command));
        ok = send_data(dat);
    }
    if(ok>0)
    {
    printf("send data: %s\n",dat);

    }
    free(dat);
}

//Полярный код выглядит так:

int main()
{
    char command[30];
    While(1)
    {....}
    return 0;
}
  • 1
    где объявлена command ?
  • 3
    Если предполагается, что это C ++, используйте std::string и не используйте malloc за исключением взаимодействия с C. Плюс потерять тэг C.
Показать ещё 8 комментариев
Теги:

2 ответа

4
Лучший ответ

Solution1 Заменить memcpy(dat,command,sizeof(command)); с memcpy(dat,command,m_size);

(Не перезаписывайте выделенный буфер)

Решение2 Или используйте dat =(char *)malloc(sizeof(command));

(Выделите больший буфер, если вы хотите написать больше)

Solution3 После command[m_size-2] = '\r'; , добавьте еще одну строку

command[m_size-1] = '\0'; /* Make it NUL terminated */

И замените memcpy(dat,command,sizeof(command)); с strcpy(dat, command)

(Использовать strcpy вместо memcpy)

Solution4

while(1)
{
    std::string command;
    std::cout<<"Enter command\n";
    std::cin>>command;
    command += '\r';
    ok = send_data(command.c_str());
    if(ok>0)
    {
        printf("send data: %s\n",dat.c_str());
    }
}

Напишите код стиля C++ (std::string поскольку ваш компилятор C++)

  • 2
    вы должны привести приведенное значение malloc в C ++
4

Объем памяти, который вы выделяете для этого dat - m_size

dat = (char*)malloc(m_size);

Объем памяти, который вы изменяете с помощью dat - sizeof(command)

memcpy(dat,command,sizeof(command));

Зачем?

Судя по остальной части кода, sizeof(command) обычно больше m_size, а это означает, что с помощью этой memcpy вы перезаписываете свою память и уничтожаете целостность кучи. Следовательно, сбой на free(dat).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню