原文地址:http://1023mmmm.blog.163.com/blog/static/388402252013710103029193/
原本在ubuntu10.04运行好好的程序。换到12版本原先的警告就变成了一大堆错误。
好吧好吧,挨个修改修改。but段错误了有木有
最后定位到inet_ntoa。but这是系统函数,我的参数绝对木有错误有木有,百度了下,幸好有人跟我翻了一样的错误
问题解决的原因堪称奇葩:
http://www.cnblogs.com/renhao/archive/2012/03/08/2385194.html
直接把人家的东西复制过来吧,
以下是转来的:
发现出错在 inet_ntoa 那一行。查看了 inet_ntoa 的帮助,没有发现什么特别的地方。
试着打开编译的warning开关看看有没有什么发现:
- [shengkui@uranus ~]$ gcc -g -o getaddr getaddr.c -Wall
- getaddr.c: In function 'get_host_ip':
- getaddr.c:26: warning: implicit declaration of function 'inet_ntoa'
- getaddr.c:26: warning: format '%s' expects type 'char *', but argument 2 has type 'int'
inet_ntoa 没有声明,是因为没有加必须的头文件。
inet_ntoa 的返回值是 “char *”, 而编译器似乎把它的返回值当成了int?是这个导致的错误吗?
在64位的Linux 下,int是32位的,而指针(在这里是 char *)是64位的。问题应该就是出在这里!
我把 inet_ntoa 需要的头文件加上去:
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <arpa/inet.h>
编译,运行,结果正确,没有段错误!
笔者按:上面描述了一个发现问题解决问题的方案,发现错误后原作者加了-Wall选项,编译后多了一条
warning: implicit declaration of function 'inet_ntoa'的提示,笔者看到这个问题准备自己解决“inet_ntoa 的返回值是 “char *”, 而编译器似乎把它的返回值当成了int?是这个导致的错误吗?”纠结了半天,也想过加上-Wall选项,但是感觉-Wall只是提示警告,现在警告已经有了,没想到加上多了个警告提示,这个提示正式解决问题的方法。