免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1423 | 回复: 1
打印 上一主题 下一主题

[内核模块] 平台设备资源获取源码分析之疑问 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-07-18 16:47 |只看该作者 |倒序浏览
    今天学习平台设备驱动时,查看内核获取资源函数的源代码如下/drivers/base/platform.c:
struct resource *platform_get_resource(struct platform_device *dev,
       unsigned int type, unsigned int num)
{
int i;

for (i = 0; i < dev->num_resources; i++) {
struct resource *r = &dev->resource;

if (type == resource_type(r) && num-- == 0)
return r;
}
return NULL;
}
如上红色标记部分,不明白为什么在for()循环内部来创建指针变量,这样若有多次循环的话,就会重复创建同样的变量了?是不是应该改为:
struct resource *platform_get_resource(struct platform_device *dev,
       unsigned int type, unsigned int num)
{
int i;
struct resource *r;

for (i = 0; i < dev->num_resources; i++) {
r = &dev->resource;

if (type == resource_type(r) && num-- == 0)
return r;
}
return NULL;
}

论坛徽章:
0
2 [报告]
发表于 2013-08-21 11:23 |只看该作者
没人回帖,我自己顶一下!
我自己写了一个测试程序如下:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
  int i,j;
  unsigned char value = 10;

  for(i = 0;i < 50;i++)
  {
    unsigned char temp = value;
    printf("%d temp  = %ud  ",i,temp);
    printf("%d &temp = %ud\n",i,&temp);
  }
  for(j = 0;j < 50;j++)
  {
    unsigned char temp = value;
    printf("%d temp  = %ud  ",j,temp);
    printf("%d &temp = %ud\n",j,&temp);
  }
}
编译通过,且运行结果为:
0 temp  = 10d  0 &temp = 3218612227d
1 temp  = 10d  1 &temp = 3218612227d
2 temp  = 10d  2 &temp = 3218612227d
3 temp  = 10d  3 &temp = 3218612227d
4 temp  = 10d  4 &temp = 3218612227d
5 temp  = 10d  5 &temp = 3218612227d
6 temp  = 10d  6 &temp = 3218612227d
7 temp  = 10d  7 &temp = 3218612227d
8 temp  = 10d  8 &temp = 3218612227d
9 temp  = 10d  9 &temp = 3218612227d
10 temp  = 10d  10 &temp = 3218612227d
11 temp  = 10d  11 &temp = 3218612227d
12 temp  = 10d  12 &temp = 3218612227d
。。。。。。。。。。。。。。。。。。。。。。。。
0 temp  = 10d  0 &temp = 3218612226d
1 temp  = 10d  1 &temp = 3218612226d
2 temp  = 10d  2 &temp = 3218612226d
3 temp  = 10d  3 &temp = 3218612226d
4 temp  = 10d  4 &temp = 3218612226d
5 temp  = 10d  5 &temp = 3218612226d
6 temp  = 10d  6 &temp = 3218612226d
7 temp  = 10d  7 &temp = 3218612226d
8 temp  = 10d  8 &temp = 3218612226d
9 temp  = 10d  9 &temp = 3218612226d
10 temp  = 10d  10 &temp = 3218612226d
11 temp  = 10d  11 &temp = 3218612226d
12 temp  = 10d  12 &temp = 3218612226d
。。。。。。。。。。。。。。。。。。。。。。。。
相信看运行结果,大家已经清楚为什么了。详细可以去看一下GNU C标准。

说说这样写的好处:作用范围只在{}之内,使代码更加清晰。因为不需要将所有的局部变量全部定义在函数的开头;若函数太长时,这样写阅读代码时更加方便;
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP