题
我正在设计一个协议(在C中)以实现层次的OSI网络结构,使用CNET(http://www.csse.uwa.edu.au/cnet/)。我在运行时遇到了SIGSEGV错误,但是CNET会编译我的源代码文件本身(我无法通过GCC进行编译),因此我无法轻松使用任何调试工具(例如GDB)来查找错误。
这是所使用的结构,以及所讨论的代码:
typedef struct {
char *data;
} DATA;
typedef struct {
CnetAddr src_addr;
CnetAddr dest_addr;
PACKET_TYPE type;
DATA data;
} Packet;
typedef struct {
int length;
int checksum;
Packet datagram;
} Frame;
static void keyboard(CnetEvent ev, CnetTimerID timer, CnetData data)
{
char line[80];
int length;
length = sizeof(line);
CHECK(CNET_read_keyboard((void *)line, (unsigned int *)&length)); // Reads input from keyboard
if(length > 1)
{ /* not just a blank line */
printf("\tsending %d bytes - \"%s\"\n", length, line);
application_downto_transport(1, line, &length);
}
}
void application_downto_transport(int link, char *msg, int *length)
{
transport_downto_network(link, msg, length);
}
void transport_downto_network(int link, char *msg, int *length)
{
Packet *p;
DATA *d;
p = (Packet *)malloc(sizeof(Packet));
d = (DATA *)malloc(sizeof(DATA));
d->data = msg;
p->data = *d;
network_downto_datalink(link, (void *)p, length);
}
void network_downto_datalink(int link, Packet *p, int *length)
{
Frame *f;
// Encapsulate datagram and checksum into a Frame.
f = (Frame *)malloc(sizeof(Frame));
f->checksum = CNET_crc32((unsigned char *)(p->data).data, *length); // Generate 32-bit CRC for the data.
f->datagram = *p;
f->length = sizeof(f);
//Pass Frame to the CNET physical layer to send Frame to the require link.
CHECK(CNET_write_physical(link, (void *)f, (size_t *)f->length));
free(p->data);
free(p);
free(f);
}
我设法找到了该行:check(cnet_write_physical(link,(void *)f,(size_t *)f-> length));正在造成Segfault,但我无法弄清原因。任何帮助是极大的赞赏。
解决方案
我认为是第三个参数。试试这个:
CHECK(CNET_write_physical(link, (void *)f, (size_t *)(&f->length)));
在这一行中,我认为第三个参数期望指针,因为您将值铸成 (size_t *)
. 。但是您要投射的价值是一个简单的整数值。因此,每当函数删除该值中包含的地址时,您可能是在获得SigSeGV的时候。
有了我建议的代码,您正在铸造指针 (&f->length)
. 。因此,假设该功能有效地期望将尺寸固定的变量指向变量,那么您应该做得很好。
其他提示
我在这里看到两个问题 - sizeof(f)
给您一个大小 指针 不是 Frame
, ,然后您分配 size_t
- 型价值 f->length
, ,但后来把它扔给 size_t*
. 。后者很可能是分割故障的原因。
不隶属于 StackOverflow