Chinaunix

标题: 平台设备资源获取源码分析之疑问 [打印本页]

作者: xiaoxi5202    时间: 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;
}


作者: xiaoxi5202    时间: 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标准。

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





欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2