socket编程时,使用memcpy发生了一个很奇怪的段错误

ENDLESS.c 2019-05-29 02:38:28
如下图,(用手机不方便打,办公电脑又没网,只能用图片,您见谅) 当使用主机字节序与网络字节序之间相互转换的时候,memcpy这个函数不管在哪都会段错误,即使在代码开头 解决方法也很简单,把accept这一段代码封装到另一个C文件中就可解决,但实在不明白为什么会段错误?
...全文
331 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Yofoo 2019-05-30
  • 打赏
  • 举报
回复
越界是肯定的, 但是越界后是否出错要看实际情况 越界 是指访问 "this is server!" 这个 如果这个数据刚好放到一个内存区的末端, 越界到另外一段内存就可能会报错 实际情况可以直接调试看异常位置, 也可以用工具去查看exe, 看数据的位置
jiamianshiye 2019-05-29
  • 打赏
  • 举报
回复
那你只能贴gdb的bt full信息了。
ENDLESS.c 2019-05-29
  • 打赏
  • 举报
回复
引用 6 楼 jiamianshiye_16_com 的回复:
返回值和ip地址一样,头文件也是有的
jiamianshiye 2019-05-29
  • 打赏
  • 举报
回复

inet_ntop()
你关注下这个函数的返回值,与ip, 的地址是否相符合,如果不符合,很 有可能是64位系统的问题。 #include <arpa/inet.h> 如果是64位系统,加上这个头文件。
ENDLESS.c 2019-05-29
  • 打赏
  • 举报
回复
1,把memcpy换成strcpy是没有问题的 2,把sizeof(buf)换成552没有问题,换成553就段错误 看来不仅仅是长度超了的问题,毕竟把ntohs和inet_ntop两行注释掉也没有问题 这里面看来还是很复杂的~
自信男孩 2019-05-29
  • 打赏
  • 举报
回复
引用 3 楼 jiamianshiye_16_com 的回复:
我觉得问题不在于越界。memcpy只是个复制内存函数,没有超出buf的范围,这个并没有问题,只是用法很奇怪,字符串赋值不是应该用strcpy么。

但是这个段错误,应该用gdb来调试,然后你把 bt full 的信息都贴出来,这样比较好定位问题。

拷贝长度是1024,第二个参数其实是一个地址,那么拷贝的个数就是从这个地址开始的1024个字节,那么不就越界了吗?
jiamianshiye 2019-05-29
  • 打赏
  • 举报
回复
我觉得问题不在于越界。memcpy只是个复制内存函数,没有超出buf的范围,这个并没有问题,只是用法很奇怪,字符串赋值不是应该用strcpy么。 但是这个段错误,应该用gdb来调试,然后你把 bt full 的信息都贴出来,这样比较好定位问题。
自信男孩 2019-05-29
  • 打赏
  • 举报
回复
越界了 ,这个字符串的长度也只有不到20个字符,但是你要拷贝1024个字符到buf里,因此很明显越界了。
建议改成:
memcpy(buf, "xxx", strlen("xxx") + 1);
AlbertS 2019-05-29
  • 打赏
  • 举报
回复

memcpy(buf, "this is server!", sizeof(buf));
//这句操作内存越界了啊, "this is server!"这个字符串没有1024这么长,
//直接写成 char buf[1024] = "this is server!";就行了

69,373

社区成员

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

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