讨教一个在看操作系统源码时碰到的关于变量的问题

C语言 码拜 9年前 (2016-05-29) 1001次浏览
在学习操作系统相关的东西,找了一份教学用的源码在看,其中在一个初始化页表的地方发现了这样的代码:

...
    for (i = 0; i < memmap->nr_map; i ++) {
        uint64_t begin = memmap->map[i].addr, end = begin + memmap->map[i].size;
        cprintf("  memory: %08llx, [%08llx, %08llx], type = %d.\n",
                memmap->map[i].size, begin, end - 1, memmap->map[i].type);
        if (memmap->map[i].type == E820_ARM) {
            if (maxpa < end && begin < KMEMSIZE) {
                maxpa = end;
            }
        }
    }
    if (maxpa > KMEMSIZE) {
        maxpa = KMEMSIZE;
    }
    extern char end[];
    npage = maxpa / PGSIZE;
    pages = (struct Page *)ROUNDUP((void *)end, PGSIZE);
    for (i = 0; i < npage; i ++) {
        SetPageReserved(pages + i);
    }
    uintptr_t freemem = PADDR((uintptr_t)pages + sizeof(struct Page) * npage);
    for (i = 0; i < memmap->nr_map; i ++) {
        uint64_t begin = memmap->map[i].addr, end = begin + memmap->map[i].size;
        if (memmap->map[i].type == E820_ARM) {
            if (begin < freemem) {
                begin = freemem;
            }
...

注意这里面的end这个变量,这里贴的代码都是在一个函数里面的。本人觉得非常奇怪的是这里面在第一个for循环里面定义了一个end变量后,又extern了一个char类型的名为end的数组变量,然后在第二个for循环里面又定义了一次end变量。这在语法上应该怎么理解呢?在实际使用end这个变量的时候使用的是函数内的局部变量还是extern的全局变量呢?为什么在第二个循环里面又要定义一次end变量呢?

解决方案

40

就近原则,听说过么?
并且你所说的第一个循环里的end,既然是局部变量,循环的大括号就是它的作用域范围啊,对于大括号外面,它是不可见的。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明讨教一个在看操作系统源码时碰到的关于变量的问题
喜欢 (0)
[1034331897@qq.com]
分享 (0)