问题出在函数 insert_envar 上:
`char **get_envaddress(char **envp, char *find)`
{
int i;
int length;
length = ft_strlen(find);
i = 0;
while (envp[i])
{
if (!ft_strncmp(find, envp[i], length))
return (&envp[i]);
i++;
}
return (NULL);
}
char **variable_and_end(char *string)
{
return ((char *[]){envvar, &string[index]});
}
void insert_envar(char **string, char *varplus, char **envp)
{
char *build;
*varplus = 0;
varplus = (char *)variable_and_end(varplus + 1);
envp = get_envaddress(envp, ((char **)varplus)[0]);
*envp = ft_strchr(*envp, '=') + 1;
free(((char **)varplus)[0]);
varplus = ((char **)varplus)[1];
build = ft_strjoin(*string, *envp);
ft_stradd(&build, varplus);
free(*string);
*string = build;
}`
这里的问题是,当 varplus 接收到复合文字时,可以同时打印 [0] 和 [1],它们完全符合我的预期,但是在调用函数 get_envaddres 后,varplus 的内容发生了变化,甚至 [0] 和 [1] 的内存地址也发生了变化。 我根本不明白 get_envaddress 如何接触 varplus 内存或值。
我唯一能够推测的是计算机正在移动其堆栈内存并弄乱复合文字。
那么我怎么会失去varplus呢? (我意识到有一百万种更好的方法来编写这段代码,这是为了理解计算机的行为。)
在将两个字符串放入 varplus 后,我尝试将它们保存在不同的指针中。程序运行后就像我预期的那样。
有了这个:
void insert_envar(char **string, char *varplus, char **envp)
{
char *build;
*varplus = 0;
varplus = (char *)variable_and_end(varplus + 1);
test[0] = ((char **)varplus)[0];
test[1] = ((char **)varplus)[1];
printf("varplus: [0] = %s\nvarplus: [1] = %s\n", ((char **)varplus)[0], ((char **)varplus[1]);
envp = get_envaddress(envp, ((char **)varplus)[0]);
printf("varplus: [0] = %s\nvarplus: [1] = %s\n", ((char **)varplus)[0], ((char **)varplus[1]);
printf("test: [0] = %s\ntest: [1] = %s\n", test[0], test[1]);
*envp = ft_strchr(*envp, '=') + 1;
free(((char **)varplus)[0]);
varplus = ((char **)varplus)[1];
build = ft_strjoin(*string, *envp);
ft_stradd(&build, varplus);
free(*string);
*string = build;
}
我得到这个输出
varplus: [0] = PATH
varplus: [1] = "asd
varplus: [0] = PATH
varplus: [1] = ���
test: [0] = PATH
test: [1] = "asd
因此 varplus 在函数调用之前保留正确的字符串,但在函数调用之后中断,而 test 则始终保留它们。这让我觉得我正在失去阵列。