YAFFS2 之局部指针变量赋值问题.

今天在阅读 YAFFS2 的源代码时, 遇到了一个基础的问题, 如题. 


函数源代码是这样的:    

static int yaffs_alloc_chunk(struct yaffs_dev *dev, int use_reserver,
			     struct yaffs_block_info **block_ptr)
{
	int ret_val;
	struct yaffs_block_info *bi;        // 局部指针变量

	if (dev->alloc_block < 0) {
		/* Get next block to allocate off */
		dev->alloc_block = yaffs_find_alloc_block(dev);
		dev->alloc_page = 0;
	}

	if (!use_reserver && !yaffs_check_alloc_available(dev, 1)) {
		/* No space unless we're allowed to use the reserve. */
		return -1;
	}

	if (dev->n_erased_blocks < dev->param.n_reserved_blocks
	    && dev->alloc_page == 0)
		yaffs_trace(YAFFS_TRACE_ALLOCATE, "Allocating reserve");

	/* Next page please.... */
	if (dev->alloc_block >= 0) {
		bi = yaffs_get_block_info(dev, dev->alloc_block);        // QAQ

		ret_val = (dev->alloc_block * dev->param.chunks_per_block) +
		    dev->alloc_page;
		bi->pages_in_use++;
		yaffs_set_chunk_bit(dev, dev->alloc_block, dev->alloc_page);

		dev->alloc_page++;

		dev->n_free_chunks--;

		/* If the block is full set the state to full */
		if (dev->alloc_page >= dev->param.chunks_per_block) {
			bi->block_state = YAFFS_BLOCK_STATE_FULL;
			dev->alloc_block = -1;
		}

		if (block_ptr)
			*block_ptr = bi;        // 这里居然将地址传递给了, *block_ptr(二级指针) 

		return ret_val;
	}

	yaffs_trace(YAFFS_TRACE_ERROR,
		"!!!!!!!!! Allocator out !!!!!!!!!!!!!!!!!");

	return -1;
}
看的时候还在纳闷, 我擦........这样传递有啥意义? 函数结束后, 你再引用他的值, 不就错了吗? 因为栈已经销毁了呀. 

在我准备提问的时候, 编辑帖子的过程中发现了, 还是我太样了. 

没有仔细阅读  yaffs_alloc_chunk 函数, bi "偷偷"被 yaffs_get_block_info (代码在下面)赋值成了 &dev->block_info[blk - dev->internal_start_block].........................

所以, 这个 bi 只是在中间起到了过度作用.  期间对 bi 成员的操作其实都是对 dev 成员中成员的操作. 我了个去. 

/* Function to manipulate block info */
static inline struct yaffs_block_info *yaffs_get_block_info(struct yaffs_dev
							      *dev, int blk)
{
	if (blk < dev->internal_start_block || blk > dev->internal_end_block) {
		yaffs_trace(YAFFS_TRACE_ERROR,
			"**>> yaffs: get_block_info block %d is not valid",
			blk);
		BUG();
	}
	return &dev->block_info[blk - dev->internal_start_block];
}

// 源码位置: YAFFS2/yaffs_guts.c & yaffs_getblockinfo.h


有点感想, 这种临时没有转过弯的事太多了, 尤其在研发中, 各种基础交织. 其实多想想就会发现问题所在. 也会

认识自己的不足. 

我现在明白为啥 Jeff Atwood 和 刘未鹏等大拿强烈建议大家有问题就问, 养成写博客等写作习惯了. 

因为你在问/写的过程中, 就会理所当然的对自己遇到的问题和解决问题的过程进行一遍详细思维重现, 以便能够

清晰的描述问题和疑问.

而这个重现思考的过程中, 多数情况下, 提问者自己会对问题有更深的认识, 发现自己的思维误区, 并自己解决

问题. 就算不能自己解决, 凭借重现思维时对问题和思考的进一步认识, 也会在别人帮你解决问题时, 领悟的更

深刻. 

可见, 提问和写作实在是居家旅行, 提升技能, 超越自己的必备良药. →_→



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值