【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

发布了242 篇原创文章 · 获赞 95 · 访问量 61万+

猜你喜欢

转载自blog.csdn.net/think_ycx/article/details/103072571