Segmentation fault Linux上报错 C语言

色郎中 2016-05-19 04:38:32

#include "net_config.h" //包括头文件
#include <arpa/inet.h>
void main(void)
{
struct in_addr intaddr;
char net_dev[32];
strcpy(net_dev,gateway_dev(0));
memcpy((char *) &intaddr, (char *)get_ipAddress(net_dev),15);
//printf("IP: %s \n", (char *)get_ipAddress(net_dev));
}


 memcpy((char *) &intaddr, (char *)get_ipAddress(net_dev),15);

这句就报错
Segmentation fault


屏蔽该句,,改为打印时,就正常获取到IP了, 为啥memcpy 时,就报错呢?


char *get_ipAddress(char *net_dev)
{
int sfd;
struct ifreq ifr;
struct sockaddr_in *sin = (struct sockaddr_in *) &ifr.ifr_addr;
char *str = NULL;
char *noip = "";
char *buf = NULL;
memset(&ifr, 0, sizeof ifr);
if (0 > (sfd = socket(AF_INET, SOCK_STREAM, 0)))
{
perror("getLocalAddress() socket()");
return noip;
}
strcpy(ifr.ifr_name, net_dev);
sin->sin_family = AF_INET;
if (0 == ioctl(sfd, SIOCGIFADDR, &ifr))
{
buf = malloc(16);
bzero(buf, 0);
str = inet_ntoa(sin->sin_addr);
strncpy(buf, str, 15);
return buf;
}
return noip;
}
...全文
457 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
色郎中 2016-06-27
  • 打赏
  • 举报
回复
重写了 换了个方法 嘿嘿
蒲-公-英 2016-05-22
  • 打赏
  • 举报
回复
bullshit,using gdb to look the memory
xigua1102 2016-05-20
  • 打赏
  • 举报
回复
memcpy后面那个长度是字节,你拷贝的是15个字节 in_addr这个里面是32位的u_int 数,通常为4个字节 装不下 应该是这个问题,代码未进行测试
brookmill 2016-05-19
  • 打赏
  • 举报
回复
这里应该是用inet_aton之类的来转换吧
brookmill 2016-05-19
  • 打赏
  • 举报
回复
struct in_addr是一个32位整数。比如192.168.x.x大概就是0xC0A8xxxx /* Internet address. */ struct in_addr { uint32_t s_addr; /* address in network byte order */ }; intaddr只占用4个字节,写15个字节进去,栈就爆了。
fly 100% 2016-05-19
  • 打赏
  • 举报
回复
这个地址是非法地址 你打印出来吧

23,120

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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