我正在为我的学校写一个程序。
我需要使用术语env但是如果校正器用env -i启动我的程序,我的程序会出现段错误。
启动程序时如何避免C中的空env?
由于
答案 0 :(得分:0)
通常情况下::
#include <stdio.h>
main (int argc, char **argv, char **env)
{
// Do Something.
char *envHomepath;
envHomepath = getenv("HOME");
if (envHomepath == NULL)
printf("HOME env is NULL\n");
else
printf("HOME env is %s\n", envHomepath);
return 0;
}
然后 它将输出到控制台
HOME env是/user/xxxxx.xxx&lt; - 这是您的用户名。
答案 1 :(得分:0)
您有多种方法可以访问环境:
int main(int argc, char **argv, char **envp);
)char **environ;
)"VARNAME=value"
形式的字符串。环境始终存在,因为它通常通过来自父进程的exec(2)
系统调用(在unix和MS-DOS / Windows系统中)作为一组nul(\ 0)传递给进程终止字符串,后跟一个nul(在最后一个字符串后面的另一个\ 0)所以环境的结尾可能是两个nul的顺序(这是它在msdos上传递的方式,在其他unices中你可以有另一种方法来执行此操作)。一个空的环境就是传递一个空的字符串数组(只是一个NULL
指针来指示环境的结束)。
尽管如此,main()
接收(以及environ
变量)也是一个char
指向字符串的数组(通常通过基本的C运行时准备),然后是NULL
指向信号端的指针,因此空的环境将类似于:
char **environ = { NULL }; /* at least a NULL pointer to indicate the end of the environment */
如果你检查这个(if (environ[0] == NULL)
),你会得到一个空的环境。请注意,必须明确调用正确的 exec(2)调用,才能包含一个空的环境字符串数组。这是一个非常罕见的情况,如果您尝试在空的环境中调用许多标准程序,可能会遇到麻烦。
这同样适用于arg列表,在这种情况下,几乎所有unices遵循在argv [argc]中放置NULL的约定,你可以这样做,但要小心,因为你几乎总是有一个字符串(程序)姓名)所以
env
主要收到:
int argc = 1;
char **argv = { "env", NULL };
和
env -i
将在主要收到:
int argc = 2;
char **argv = { "env", "-i", NULL };
此外,可以(在unix中,而不是在ms-dos中)传递一个空的arg列表。这是非常罕见的和体系结构相关的(linux使用它来询问共享可执行文件--- .so文件---它有什么依赖项)所以很少期待一个空的参数列表。
您可以检测它,例如检查if (argc == 0)
。
我是在谈论内存,但我认为将NULL
放在argv
列表末尾的惯例是POSIX约定。欢迎提出意见。