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