当我们执行setenv()
或putenv()
时,“UNIX环境中的高级编程”一书中说,当我们修改环境列表的值时,它很复杂。
基本上,环境列表存储在堆栈顶部。
然而,本书在name=value
结构中说,如果我们将名称的旧值更改为新值(大于旧值),我们必须malloc()
获取空间新字符串,将新字符串复制到此区域,然后使用指向此分配区域的指针替换环境列表中的旧指针以获取相应的名称(它必须是堆区域,因为我们使用malloc()
)。
但是,基本上环境列表存储在堆栈的顶部。因此,新值必须位于此处,而不是堆区域(malloc()
的区域)。那么,为什么这个值在堆区域,而不是堆栈顶部?
有char** environ
个全局变量,这个双指针指向指向name=value
个字符串的指针数组。我认为这个name=value
字符串是environ
指针数组指向的数据之一。这就是为什么我无法理解指针点堆积区域(在上面的情况下存储新值)。
答案 0 :(得分:2)
一旦开始修改环境,就不需要将新信息放在堆栈顶部。实际上,并不要求将原始环境放置在堆栈的顶部,但这是它的常见位置。唯一的要求是environ
指向以空值终止的char *
值数组,每个值都是环境变量的值(未指定顺序),因此getenv()
知道在哪里搜索,putenv()
,setenv()
和unsetenv()
知道要操作的内容。如果使用putenv()
,则基本上保证新环境变量(或现有环境变量的新值)不会与原始变量位于同一区域。没有什么可以阻止您在(只读)文本段或静态数组中分配的静态字符串中硬连接环境变量值。如果您使用setenv()
,则新值可能属于原始值,但更有可能位于其他位置。