每当环境变量的值大于此方法中的键时,我就会遇到缓冲区溢出。 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;
答案 0 :(得分: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()
释放)。