1

每当环境变量的值大于此方法中的键时,我就会出现缓冲区溢出。Target 是为令牌动态分配的二维数组的一部分。每当我用比它长的值替换作为环境变量的标记时,它都会流入下一个标记。我尝试添加一个 realloc 来尝试修复它,但它不起作用或导致段错误。

如果有人有任何建议或可以指出我忽略的东西,我将不胜感激,因为我有一种感觉,当我发现它时我会踢自己。

方法是:

void envReplace(ENV *evlist, char *Target)
{

    if (Target[0] == '@')
    {
        memmove(Target, Target+1, strlen(Target));
        for(q = 0; q<16; q++)
        {
            if(evlist[q].envVariable!=NULL)
            {
                if(strcmp(Target, evlist[q].envVariable)==0)
                {
                    //this is where I'd add the realloc as realloc(Target, strlen(evlist[q].Value))
                    strcpy(Target, evlist[q].Value);
                    return;
                }
            }
        }
                printf("Variable not found\n");
    }
    else
    {
        printf("A value that didn't start with @ was an argument\n");
        return;
    }
}

ENV的数据结构为:

typedef struct envStorage
{
    char *envVariable;
    char *Value;
}ENV;
4

1 回答 1

0

您可以像这样将指针传递给指针,然后您可以在函数内部调用 realloc() ,修改原始指针。

void func (char **to_change) {
    // Changes the char *target in main()
    *to_change = (char *) realloc(*to_change, 20);
    sprintf (*to_change, "Blablablablabla\n");
}

int main (int argc, char **argv) {
    char *target = (char *) malloc (10);
    func(&target);
    printf(target);
    free(target);
}

在此示例中,func()写入函数char *target中的原始指针main()

在您的代码中发生的是您realloc()并分配给指针的副本。调用时复制指针envReplace()。当这个函数返回时,原始指针包含旧的内存地址,它不再是有效的分配内存(它被释放realloc())。

于 2013-10-14T01:07:05.637 回答