const指针指向一个const指针

时间:2012-08-31 14:13:56

标签: c pointers 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指针是一个问题。如果有人能够启发我,我会很高兴。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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访问它。