本文主要是介绍【Error】记一次缺失头文件的导致的getenv segment fault,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
linux c programming时,调用getenv函数时,程序会触发segment fault。定位到的现象:
环境:amd64 ubuntu16.04 gcc-5
代码1:
printf("pwd %p\n", getenv("PWD"));
对应汇编:
这里我们可以看到,getenv返回的值保存在rax中,但是printf的参数是eax传递的。因此64bit的地址会被截断成32位。
代码2:
printf("pwd %p\n", (void *)getenv("PWD"));
这里在getenv处加了强制类型转换,成一个指针类型。汇编层面编译器做了优化,cdqe代表扩展带符号扩展,从32bit扩展到64bit符。因此结果可能是0xffffffffffffef79 。
解决方案:
产生问题的原因,在于没有加头文件。
#include <stdlib.h>
参考:
https://lauri.xn--vsandi-pxa.com/2010/06/getenv-segfaults.html
这篇关于【Error】记一次缺失头文件的导致的getenv segment fault的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!