При попытке освободить () структуру char * поле получило исключение SIGTRAP - PullRequest
0 голосов
/ 24 октября 2018

Не могу понять, что я делаю неправильно, исключение срабатывает при вызове функции free(packet->protocol);.Я на Windows 7 x64 компиляции с mingw64 (gcc).

Программа получила сигнал SIGTRAP, Trap / точка останова trap.0x00000000772ef3b0 в ntdll! RtlUnhandledExceptionFilter () из C: \ Windows \ SYSTEM32 \ ntdll.dll

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

/**
 * @brief 
 * 
 */
typedef struct TCP
{
    int size;
    int crc;
    char *protocol;
} tcp_p;

/**
 * @brief Building Packet
 * 
 * @param packet 
 * @return int 
 */
int build_tcp_packet(tcp_p *packet)
{
    assert(packet != NULL);
    packet->size = 0;
    packet->crc = 0;
    packet->protocol = "TCP IP";
    return 0;
}

/**
 * @brief Free memory of Packet object
 * 
 * @param packet 
 */
void destroy_tcp_packet(tcp_p *packet)
{
    assert(packet != NULL);
    free(packet->protocol);//**Exception here**
    free(packet);
}

/**
 * @brief 
 * 
 * @return int 
 */
int main(int argc, char **argv)
{
    tcp_p *tcp_packet = malloc(sizeof(tcp_p));

    build_tcp_packet(tcp_packet);
    printf("%s\n", tcp_packet->protocol);
    destroy_tcp_packet(tcp_packet);
    getchar();

    return 0;
}

1 Ответ

0 голосов
/ 24 октября 2018

Значение, которое вы назначаете этому полю, находится не в куче, а в стеке функции build_tcp_packet.Попробуйте packet->protocol = strdup("TCP IP"); вместо.

...