2012-08-31 245 views
2

我正在使用一些内存指针。我不想使用哈希定义,请将讨论放在一边。我只是想知道为什么这个不能编译:const指针指向一个const指针

#include <stdio.h> 

static const unsigned long *const pMemAddrA = (unsigned long *) 0x00000200ul; 
static const unsigned long *const pMemAddrB = pMemAddrA; 

int main (void) 
{ 
    printf("%x", (unsigned int) pMemAddrB); 
    return 0; 
} 

编译器GCC输出:

||=== TestConst, Debug ===| 
...main.c|4|error: initializer element is not constant| 
||=== Build finished: 1 errors, 0 warnings ===| 

编辑:

看完了答案,我很高兴地知道如何去关于这个问题。

但我不明白为什么它是一个问题。从我所知道的静态内存在程序启动时被分配。我知道如果变量“活”在不同的文件中,并且编译器无法保证变量的分配顺序,就会出现问题。然而,如果两个变量都“活在”同一个文件中 - 就像两个变量都在同一个函数中一样 - 我想编译器可以确保内存按照文件中声明的变量顺序分配,理解为什么声明和初始化一个const指针指向另一个const指针是个问题。如果有人能够启发我,我会很开心。

+4

什么是不工作的意思?如果它没有编译后编译器错误,如果它显示输出后的意外输出。 – djechlin

+0

如果你想添加*什么*“不起作用”的意思,我们可以帮助你更好。 – glglgl

+0

对不起。 – AudioDroid

回答

2

您的指针具有文件范围,所以初始值必须是常量表达式。 pMemAddrA不是一个常量表达式,因此不能用于初始化具有静态存储的变量。

它可以用来初始化块作用域的变量,因此,如果你移动你的声明中main(并至少第二非静态),它将编译:

#include <stdio.h> 

int main (void) 
{ 

    const unsigned long *const pMemAddrA = (unsigned long *) 0x00000200ul; 
    const unsigned long *const pMemAddrB = pMemAddrA; 

    printf("%x", (unsigned int) pMemAddrB); 
    return 0; 
} 

如果两个指针必须在文件范围中声明,也没有办法来防止任一重复初始化表达,

static const unsigned long *const pMemAddrA = (unsigned long *) 0x00000200ul; 
static const unsigned long *const pMemAddrB = (unsigned long *) 0x00000200ul; 

#define荷兰国际集团它。

+0

我得到的结果没有使用静态。 – AudioDroid

+0

声明在文件范围内,所以变量有静态存储,不管你是否声明它们是静态的。 –

+0

好的,我明白了。 – AudioDroid

2

你没有描述什么 “不工作”,但我猜你的意思是行

static const unsigned long *const pMemAddrB = pMemAddrA; 

产生错误

error: initializer element is not constant 

解决方法是确实这个初始化器不被视为常量。取而代之的是,pMemAddrA的存储区域被预留,并且在那里写入值0x00000200ul。从那里开始,这是一个值得记忆的地方,而不是一个持续的表达。

根据您想与做什么,你可以添加另一个指针间接如

static const unsigned long *const * const pMemAddrB = &pMemAddrA; 

和访问它*pMemAddrB,而不是pMemAddrB

+0

谢谢。我理解了一些。这是否意味着除非使用散列定义这个,我不能让它工作?你能再详细一点吗? – AudioDroid

+0

@AudioDroid你可以重复你用来初始化'pMemAddrA'的同一个常量表达式,或者你可以在块范围内声明变量,并且使用'pMemAddrA'作为'pMemAddrB'的初始化。 –

+0

@AudioDroid我已经添加了一个解决方法,可能会或可能不会有用的,你打算做什么。 – glglgl

相关问题