gpt4 book ai didi

c - extern char **environ 和 extern char *environ[] 有什么区别

转载 作者:IT王子 更新时间:2023-10-29 00:51:40 27 4
gpt4 key购买 nike

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

extern char *environ[];
int main(int argc, char *argv[])
{
int index = 0;
char **env = environ;
printf("Environment variables:\n");
index = 0;
while (env[index])
{
printf("envp[%d]: %s\n", index, env[index]);
++index;
}
return 0;
}

输出:

Environment variables:  
envp[0]: GH#þ

我想打印所有的环境,但是不行。
我将 extern char *environ[] 更改为 extern char **environ 并且它可以打印所有环境。
更改代码输出后:

Environment variables:
envp[0]: XDG_SESSION_ID=8
envp[1]: TERM=xterm
envp[2]: SHELL=/bin/bash
envp[3]: SSH_CLIENT=192.168.1.224 1085 22
envp[4]: SSH_TTY=/dev/pts/0
...

最佳答案

如果不考虑内存中的实际内容及其组织方式,我发现这些东西是不可能理解的。

内存中的某处是一堆包含环境字符串的数据 block ——“foo=bar”、“hello=world”等等。为了便于讨论,我们假设“foo=bar”位于地址 100,而“hello=world”位于地址 200。

内存中的其他地方是另一个数据 block ,列出了这些数据 block 的地址(通常后跟一个零,所以如果我们事先不知道大小,我们知道列表实际结束的位置}。所以这个 block 包含数据

{100,200,0}

如果我将这个数据定义为 char *env[] 那将意味着内存中有一个叫做 env 的地方,那个地方就是实际的数据 block {100,200,0}。也就是说,env 中的数据本身就是数字 100,这是其中一个环境字符串的地址。 env 之后的下一个位置将包含 200,然后是 0(好吧,我简化了一点)。

如果我将数据 block {100,200,0} 定义为 char **,这意味着内存中有一个名为 env 的位置,其中包含数据 block {100,200,0}。 env 中存储的数据不是“100”(字符串的地址)。它将是一个地址,指示数据 block {100,200,0} 的开始。

在 C 程序中,环境实际上是一个 char **,即 environ 不是地址列表的开始的字符串,它是字符串地址列表的地址。要看到这一点,您可以错误地定义它,然后更正它,如原始代码的这个修改版本:

extern char *environ[];
int main(int argc, char *argv[])
{
int index = 0;
char **env = (char **)environ[0];
printf("Environment variables:\n");
index = 0;
while (env[index])
{
printf("envp[%d]: %s\n", index, env[index]);
++index;
}
return 0;
}

使用 char *environ[] 告诉编译器(错误地)名为 environ 的位置开始了一个指向字符串的指针列表,在内存中一个接一个地排列点往前。事实上,只有位于 environ 确切位置的数据才是相关的。我们可以将该数据视为 environ[0],并将其转换为真正的数据类型,即 char **

由于 C 不允许数组被传递给一个函数。函数的所有参数都是一个数字——要么是整数或 float 之类的原始值,要么是某物的地址。如果您尝试传递一个数组(即一个数据 block ),则会传递该 block 的起始地址。这意味着在大多数代码中,您实际上可以使用 char **char *[] 就好像它们是同一件事一样。当数据以某种方式在内存中排列时,您会遇到问题 - 就像在这个问题中一样 - 除非程序员使用正确的类型声明告诉它,否则编译器无法计算出这种方式。

关于c - extern char **environ 和 extern char *environ[] 有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46830654/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com