什么触发计算机释放复合文字?

问题描述 投票:0回答:0

问题出在函数 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 则始终保留它们。这让我觉得我正在失去阵列。

c pointers compound-literals
© www.soinside.com 2019 - 2024. All rights reserved.