堆栈的内存分配

xiaoxiao2021-03-01  32

#内存分配 ##遇到的问题 最近工作中遇到一个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循环的外面,就没有再出现这个问题。

转载请注明原文地址: https://www.6miu.com/read-4549981.html

最新回复(0)