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

ENDLESS.c 2019-05-29 02:38:28
如下图,(用手机不方便打,办公电脑又没网,只能用图片,您见谅) 当使用主机字节序与网络字节序之间相互转换的时候,memcpy这个函数不管在哪都会段错误,即使在代码开头 解决方法也很简单,把accept这一段代码封装到另一个C文件中就可解决,但实在不明白为什么会段错误?
...全文
120 点赞 收藏 9
写回复
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!";就行了
回复 点赞
发动态
发帖子
C语言
创建于2007-09-28

3.2w+

社区成员

24.0w+

社区内容

C语言相关问题讨论
社区公告
暂无公告