调试经验--缺少头文件导致的段错误
今天在调试程序遇到一个段错误。而检查程序逻辑没有可能产生错误可能性。最终通过google找到了该问题的愿意。
以下是转来的:
发现出错在 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>
编译,运行,结果正确,没有段错误!
这个问题提醒我们,函数的声明不是可有可无的,不要小看任何一个warning。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律