linux C/C++查看环境变量和getenv()出现segmentation fault错误

1. 在c中,main函数的前两个参数argc, argv被很多人熟悉,但main函数还有第三个参数------arge。main的第三个参数里存的是系统变量,所以可以通过这个参数获得系统环境变量

#include <stdio.h>
 
int main(int argc, char** argv, char** arge)
{
    while(*arge)
    {
        printf("%s\n", *arge++);
    }
    return 0;
}

2. 系统包含一个environ指向环境变量的列表

#include <stdio.h>
#include <stdlib.h>
 
extern char** environ;
 
int main(int argc, char** argv, char** arge)
{
    while(*environ)
    {
        printf("%s\n", *environ++);
    }
    return 0;
}

3.获取某个环境变量值可以使用getenv()函数

include <stdlib.h>

char *getenv(const char *name);

描述:getenv函数在环境列表中寻找name,并且返回对应到变量值

返回值:如果存在返回该环境值,不存在返回NULL

#include <stdio.h>
#include <stdlib.h>
 
main()
{
    printf("%s\n", getenv("PATH"));
}

4.设置和删除环境变量

#include <stdio.h>
#include <stdlib.h>
 
int main()
{
    int r;
    r = setenv("noexist", "noexist-value", 0); //noexist不存在,将在环境列表中创建,并且值为noexist-value
    if(-1 == r) exit(-1);
    printf("%s\n", getenv("noexist"));
    sleep(2);
    r = unsetenv("noexist");                   //删除环境变量
    if(0 == r)
        printf("删除环境变量成功\n");
    
}

自己在尝试时出现了段错误,源代码:

#include<stdio.h>
#include<stdlib.h>
#include<memory.h>
extern char** environ;
int main(int argc, char** argv, char** arge)
{
       while(*environ)
       {
                printf("%s\n", *environ++);
        }
        printf("%s\n",p);
        return 0;
}

错误:


QQ截图20200709135436.jpg

错误原因:
由于再linux中,环境变量存储在environ字符串数组指针中,再第一个while循环中我尝试遍历environ,但结束后enviorn已经指向了结束符号。
如果这时出现了段错误,说明getenv()函数,检索的表为environ数组,因此将environ数组遍历后恢复就可以正常运行了:

#include<stdio.h>
#include<stdlib.h>
#include<memory.h>
extern char** environ;
int main(int argc, char** argv, char** arge)
{
       int count = 0;
       while(*environ)
       {
                count++;
                printf("%s\n", *environ++);
        }
        environ -= count;
        printf("%s\n",p);
        return 0;
}

运行结果:


QQ截图20200709140230.jpg
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容