gpt4 book ai didi

c - SIGSEGV问题

转载 作者:太空宇宙 更新时间:2023-11-03 23:36:18 24 4
gpt4 key购买 nike

我正在设计一个协议(protocol)(用 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));导致段错误,但我不知道为什么。非常感谢任何帮助。

最佳答案

我认为是第三个参数。试试这个:

CHECK(CNET_write_physical(link, (void *)f, (size_t *)(&f->length)));

在这一行中,我假设第三个参数需要一个指针,因为您正在将一个值转换为 (size_t *)。但是您要转换的值是一个简单的整数值。因此,每当函数取消引用该值中包含的地址时,您就可能收到 SIGSEGV。

使用我建议的代码,您正在转换指针(&f->length)。因此,您应该可以开始了,假设该函数有效地期望指向一个包含大小的变量的指针。

关于c - SIGSEGV问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2890623/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com