environ似乎没有以NULL结尾

Hor*_*ith 0 c null environment-variables segmentation-fault

以下代码似乎以"分段错误(核心转储)"结束.我认为environ变量应该以NULL终止指针结束.我只想打印每个环境变量,所以我做错了什么?我怎么知道我已经到了最后一个环境变量?

#include <stdio.h>
#include <stdlib.h>

extern char **environ;

int main(int argc, char *argv[])
{
    int i;
    char *s = *environ;
    for(i=0; s!=NULL; i++)
    {
        printf("env%d: %s\n", i, s);
        s =  *(environ+( sizeof(char *)*i ));
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Dav*_*nan 5

你的用途

*(environ+( sizeof(char *)*i ))
Run Code Online (Sandbox Code Playgroud)

是完全错的.指针算术不正确.乘法sizeof(char *)是错误的.这导致在阵列上迈出大步并且跑到最后.如果你想使用指针算法,你只需写:

*(environ+i)
Run Code Online (Sandbox Code Playgroud)

但是,当然,在那一点上,你已经把它简化为一种相当笨重的方式来说:

environ[i]
Run Code Online (Sandbox Code Playgroud)

所以,在我看来,你应该最清楚地使用environ[i].比如这样:

int i = 0;
while(environ[i] != NULL)
{
    printf("env%d: %s\n", i, environ[i]);
    i++;
}
Run Code Online (Sandbox Code Playgroud)

或者作为for循环:

for(int i = 0; environ[i] != NULL; i++)
{
    printf("env%d: %s\n", i, environ[i]);
}
Run Code Online (Sandbox Code Playgroud)