堆栈的内存分配

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值