C语言结构套结构的调用问题

yzb85 2009-09-08 08:33:37
我一直都用C#,现在要用C,很不习惯里面的指针,有肤浅之处,还请大家多指教。

#define SEND_DATA "testdata"
struct avb_as_Pdelay_Req *avb_as_msg;
avb_as_msg = (struct avb_as_Pdelay_Req*)skb_put(skb, avb_as_hdr_len(type,dev));
memcpy(avb_as_msg->reserved1, data, strlen(data));

……
return skb;
以上这么写没有问题。
avb_as_Pdelay_Req里面有一个叫header的结构,我想对里面的元素赋值。
memcpy(avb_as_msg->header.reserved1, data, strlen(data));

这样写编译通过,linux模块插入运行直接死机。

有的朋友可能会说avb_as_msg->header.reserved1=data;
但是我要返回的是skb,不是avb_as_Pdelay_Req。如果这么赋值后返回的结果中header里面的reserved1还是空的。请朋友们多多指点。
...全文
126 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
yzb85 2009-09-08
  • 打赏
  • 举报
回复
struct sk_buff *avb_as_create(int type, int ptype, struct net_device *dev, char *data)
{
struct sk_buff *skb;
struct avb_as_Pdelay_Req *avb_as_msg;

printk( KERN_ALERT "[IEEE802.1AVB] avb_as_create fuction is running.\n");

skb = alloc_skb(avb_as_hdr_len(type,dev) + LL_ALLOCATED_SPACE(dev), GFP_ATOMIC);

if (skb == NULL)
{
printk( KERN_ALERT "[IEEE 802.1AVB] avb_as module -- socket buff allocation is failed.\n");
return NULL;
}
skb_reserve(skb, LL_RESERVED_SPACE(dev));
skb->dev = dev;
skb->protocol = htons(ETH_P_AS);

avb_as_msg = (struct avb_as_Pdelay_Req*)skb_put(skb, avb_as_hdr_len(type,dev));
skb_reset_network_header(skb);
//memcpy(avb_as_msg->reserved1, data, strlen(data));

memcpy(avb_as_msg->header.reserved1, data, strlen(data));
//avb_as_msg->header.reserved1="testdata1";


if (dev_hard_header(skb, dev, ptype, dev->broadcast, dev->dev_addr, skb->len) < 0)
{
printk( KERN_ALERT "[IEEE 802.1AVB] dev_hard_header error in avb_as_create function.\n");
kfree_skb(skb);
return NULL;
}

return skb;
}
yzb85 2009-09-08
  • 打赏
  • 举报
回复
我在回头试试,谢谢大家,data是char*类型
wanghao111 2009-09-08
  • 打赏
  • 举报
回复
strlen对字符串计数时不包括末尾的‘\0’,一般用strlen之后再加1,strlen()+1,这个样使用
云梦谭 2009-09-08
  • 打赏
  • 举报
回复
skb_put的返回值是unsigned char * 强制转换成(struct avb_as_Pdelay_Req*)很可能内存越界。
memcpy(avb_as_msg->header.reserved1, data, strlen(data)); 也很可能造成溢出。
linux下执行ulimit -c unlimited,运行程序后,如果出现问题会生成一个core文件,用GDB打开,就可以查看具体的堆栈信息了。
lbjfeng 2009-09-08
  • 打赏
  • 举报
回复
你的data是??
大哥,你说得挺不清楚的·~·

我感觉很可能是data中,你用strlen的错误引起的原因。。
strlen的前提是:字符串的末尾有‘\0’

whg01 2009-09-08
  • 打赏
  • 举报
回复
skb_put的返回值是unsigned char*,你强制转换为(struct avb_as_Pdelay_Req*)很可能会出错。
memcpy(avb_as_msg->reserved1, data, strlen(data));
你确定strlen(data) <=avb_as_hdr_len(type,dev)?

yzb85 2009-09-08
  • 打赏
  • 举报
回复
明白了,果然是长度不够
avb_as_msg->header.reserved1只有1位
而data有9位,溢出了。谢谢大家!

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧