尝试释放()结构时,char*字段出现SIGTRAP异常

尝试释放()结构时,char*字段出现SIGTRAP异常,c,malloc,free,C,Malloc,Free,无法找出我做错了什么,在free(packet->protocol)上触发异常函数调用。在Windows 7 x64上使用mingw64(gcc)编译Im 程序接收信号信号陷阱,跟踪/断点陷阱。 ntdll中的0x00000000772ef3b0!RtlUnhandledExceptionFilter()来自 C:\Windows\SYSTEM32\ntdll.dll #包括 #包括 #包括 /** *@brief * */ 类型定义结构TCP { 整数大小; int crc; char*协议

无法找出我做错了什么,在
free(packet->protocol)上触发异常函数调用。在Windows 7 x64上使用mingw64(gcc)编译Im

程序接收信号信号陷阱,跟踪/断点陷阱。 ntdll中的0x00000000772ef3b0!RtlUnhandledExceptionFilter()来自 C:\Windows\SYSTEM32\ntdll.dll

#包括
#包括
#包括
/**
*@brief
* 
*/
类型定义结构TCP
{
整数大小;
int crc;
char*协议;
}tcp_p;
/**
*@brief-Building-Packet
* 
*@param包
*@return int
*/
int build_tcp_数据包(tcp_p*数据包)
{
断言(数据包!=NULL);
数据包->大小=0;
数据包->crc=0;
数据包->协议=“TCP IP”;
返回0;
}
/**
*@数据包对象的简短可用内存
* 
*@param包
*/
无效销毁\u tcp\u数据包(tcp\u p*数据包)
{
断言(数据包!=NULL);
免费(数据包->协议);//**此处例外**
免费(包);
}
/**
*@brief
* 
*@return int
*/
int main(int argc,字符**argv)
{
tcp_p*tcp_packet=malloc(sizeof(tcp_p));
构建tcp_数据包(tcp_数据包);
printf(“%s\n”,tcp\U数据包->协议);
销毁\u tcp\u数据包(tcp\u数据包);
getchar();
返回0;
}

分配给该字段的值不在堆上,而是在
build\u tcp\u packet
函数的堆栈上。尝试
packet->protocol=strdup(“TCP IP”)

分配给该字段的值不在堆上,而是在
build\u tcp\u packet
函数的堆栈上。尝试
packet->protocol=strdup(“TCP IP”)取而代之。

数据包->协议
不是动态分配的。因此,您不应该
释放它。
数据包->协议
不是动态分配的。所以你不应该免费使用它。
#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;
}