调试经验--缺少头文件导致的段错误

今天在调试程序遇到一个段错误。而检查程序逻辑没有可能产生错误可能性。最终通过google找到了该问题的愿意。

以下是转来的:

发现出错在 inet_ntoa 那一行。查看了 inet_ntoa 的帮助,没有发现什么特别的地方。

试着打开编译的warning开关看看有没有什么发现:
 
  1. [shengkui@uranus ~]$ gcc -g -o getaddr getaddr.c -Wall
  2. getaddr.c: In function 'get_host_ip':
  3. getaddr.c:26: warning: implicit declaration of function 'inet_ntoa'
  4. 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 需要的头文件加上去:
  1. #include <sys/socket.h>
  2. #include <netinet/in.h>
  3. #include <arpa/inet.h>
编译,运行,结果正确,没有段错误!
 
这个问题提醒我们,函数的声明不是可有可无的,不要小看任何一个warning。
posted @   戴安澜式编程  阅读(1129)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示