C 这两个环境变量(a)environ b)envp)的实际字符串存储在哪里?
我知道在运行时,C 这两个环境变量(a)environ b)envp)的实际字符串存储在哪里?,c,linux,process,operating-system,C,Linux,Process,Operating System,我知道在运行时,environ是一个全局指针变量,它最终存储在数据部分envp是在main中定义的局部变量,因此它存储在堆栈或堆栈顶部。如果我错了,请纠正我 但问题是,这两个环境的实际字符串信息存储在哪里?两个都在堆栈中 我附加了使用这两个环境变量的两个代码段。 对于环境: #include <stdlib.h> #include <stdio.h> extern char **environ; int main(int argc, char **argv) { cha
environ
是一个全局指针变量,它最终存储在数据部分envp
是在main中定义的局部变量,因此它存储在堆栈或堆栈顶部。如果我错了,请纠正我
但问题是,这两个环境的实际字符串信息存储在哪里?两个都在堆栈中
我附加了使用这两个环境变量的两个代码段。
对于环境
:
#include <stdlib.h>
#include <stdio.h>
extern char **environ;
int main(int argc, char **argv)
{ char **env_variable_ptr;
env_variable_ptr = environ;
while (*env_variable_ptr != NULL)
{ printf("%s\n", *env_variable_ptr);
env_variable_ptr++;
}
printf("\n");
}
检查特定编译器的文档 语言定义没有指定它们的存储位置,只指定存储的行为方式: 5.1.2.2.1程序启动
…
2如果已声明,则
主功能的参数应符合以下要求
约束条件:
…
-参数argc
和argv
以及argv
数组指向的字符串应
可由程序修改,并在程序之间保留其最后存储的值
启动和程序终止。
该标准没有定义envp
,但合理的假设是,任何有定义的实现都会将其视为与argv
相同。参数向量、环境字符串和一些额外信息(基于ELF的系统上的“辅助向量”)通常放在初始线程堆栈的底部之上。之所以使用此位置,是因为操作系统必须在进程启动期间为堆栈创建一个读写地址范围并向其写入内容,所以它也可以将不同调用的所有数据放在该位置
这可能在CPU和操作系统的“处理器特定应用程序二进制接口”(psABI)文档中指定。例如,请参阅的“进程初始化”部分,该部分用于大多数基于x86-64的操作系统(Windows除外),特别是第32页,其中讨论了“信息块”。在Linux上,构成程序环境的数据,以及构成程序参数的数据,存储在程序地址空间的顶部,初始堆栈的上方
指向各个值(包括环境值和参数值)的指针放在堆栈上
因为这些位置非常接近(在Linux上),所以您经常会看到“环境数据放在堆栈上”这样的语句。这只是部分正确。C没有指定具体的实现。(我甚至不认为Linux指定了——也许它指定了。)为什么它们的位置很重要?它存储在内存中的某个地方,您的进程在那里有读取权限。为什么要在意呢?根据经验,环境字符串通常存储在参数字符串之后。参数和环境的长度之和受到ARG\u MAX
的限制。它们由C标准()认可(但不强制)的替代程序启动提供,因此它们存储在一起是有意义的。但是没有任何东西指定它们被存储在哪里——只是它们被存储并可供程序使用。不一定有一个全局变量指向命令行参数。我不太有信心在编译器文档中找到详细信息,因为我不认为这是特定于编译器的,甚至不是特定于语言的(从某种意义上说,每个可执行文件都有一个运行时可访问的环境)。
int main(int argc, char **argv, char **envp){
while(*envp != NULL){
printf("%s\n", *envp);
envp++;
}
printf("\n");
}