gpt4 book ai didi

c - setenv和unsetenv如何更改堆栈?

转载 作者:行者123 更新时间:2023-12-03 09:55:48 25 4
gpt4 key购买 nike

我正在阅读一本有关操纵环境数组的函数的教科书:

If the environment array contains a string of the form name=oldvalue, thenunsetenv deletes it and setenv replaces oldvalue with newvalue, but only ifoverwrite is nonzero. If name does not exist, then setenv adds name=newvalueto the array

int setenv(const char *name, const char *newvalue, int overwrite);

void unsetenv(const char *name);
下图描述了新程序启动时用户堆栈的组织。
enter image description here
我的问题是:
Q1-假设我们使用 unsetenv删除 envp的一个元素,这不是通过用 envp替换原始值来在 NULL中造成空白吗?由于该值为 NULL,它之后的任何后续环境元素都会被淹没?
问题2-如果我们使用 setenv将旧值替换为newvalue,则如果newvalue的长度大于oldvalue,则 setenv仅修改“以空值结尾的环境变量字符串”的退出部分将不起作用。因此,我的猜测是,将有一个新元素被压入堆栈,并且 envp中相应的指针元素将相应地更改,我的理解正确吗?

最佳答案

below is a picture that depicts the organization of the user stack when a new program starts


没错,但是假设环境API仅限于操作内存是不正确的。实现可以自由复制环境变量,实际上大多数实现都可以这样做。这是一个实现该功能的libc实现示例。
https://code.woboq.org/userspace/glibc/stdlib/setenv.c.html#__add_to_environ
/* This function is used by `setenv' and `putenv'.... */
__add_to_environ (const char *name, const char *value, const char *combined,
int replace)
{
....
new_environ = (char **) realloc (last_environ,
(size + 2) * sizeof (char *));
....
if (__environ != last_environ)
memcpy ((char *) new_environ, (char *) __environ,
size * sizeof (char *));
....
last_environ = __environ = new_environ;

关于c - setenv和unsetenv如何更改堆栈?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63821293/

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