#内存分配 ##遇到的问题 最近工作中遇到一个bug,log显示刚开始从buf中读取的内容是正确的,但是将不同的指针指向buf中不同的起始地址,然后经过一些操作后,重新读取这些指针指向的内容,发现内容不正确了。
code
void cheange(char *name, char *type)
{
char *tmp_name, *tmp_type, *tmp_value,
char config_name[64]={0};
char tmp_sep = " ";
int i=0, match_flag=0;
for(i=1; i<MAX_NUM; i++){
char buf[512]={0};
sprintf(config_name, "device%d", i);
strcpy(buf, config_get(config_name));
if(strcmp(buf, "") == 0)
break;
else{
tmp_name=strock(buf, tmp_sep);
if(strcmp(tmp_name, name)==0){
match_flag=1;
tmp_value=strock(NULL, tmp_sep);
if(tmp_value = NULL)
continue;
tmp_type = strock(NULL, tmp_sep);
break;
}
}
}
if(match_flag=1)
sprintf(res_value,"%s %s %s", name, tmp_value, type);
else
sprintf(res_value,"%s 100 %s", name, type);
config_set(config_name, res_value);
return;
}
加上log发现在进入sprintf函数之前指针tmp_value指向的内容是正确的,但是经过sprintf后,我们发现有时tmp_value指针指向的内容被修改了。
reason
最先读取的config_name是存储在buf中的,但是buf是个for循环内的局部变量,在for循环内,指针tmp_name,tmp_value和tmp_typ分别指向了buf中不同的内存地址。但是当for循环结束后,系统将自动释放buf所占用的内存,但是此时真真tmp_value依然指向原来的内存地址。当进入sprintf函数式,系统需要为数组res_value在栈段分配新的内存,此时就有可能将指针tmp_value指向的内存重新分配给res_value,那最res_value的操作,就会影响到tmp_value所指向的内容。 我们把数组buf的第一和初始化放在for循环的外面,就没有再出现这个问题。