如何初始化全局const指针?

时间:2010-06-24 18:37:20

标签: c const global-variables

我有一个变量,它是链接列表的头部。我想把它变成const因为它永远不应该改变,变量在整个程序中使用,所以我认为我应该把它变成一个全局const。问题是我在声明const之后无法初始化它。

如何解决这个问题?

typedef struct PT {
 int x;
 int y;
 struct PT *next;
} POINT;

//globals
POINT * const mypoint_head;

int main(int argc, char *argv[])
{
    int size = 100;
    mypoint_head= InitPoint(size);   // error C2166: l-value specifies const object
    //rest of code

}


POINT* InitPoint(int size)
{
   POINT *tmp;
   POINT *orig;
   int a = 10;
   int b = 1000;
   orig = (POINT*) malloc (sizeof(POINT) * size);
   if(orig == NULL)
      return NULL;

   tmp = orig;
   for (i = 0; i < size; i++)
   {
      tmp->x = a++;
      tmp->y = b++;
      if (i == size -1) {
            tmp->next = NULL:
      }
      else {
            tmp->next = tmp+1; 
      }
      tmp++;
   }
   return orig;
} 

8 个答案:

答案 0 :(得分:4)

你不能 - 这就是const的全部内容。

答案 1 :(得分:2)

你是正确的,因为永远不能改变声明const的变量。不幸的是,您的mypoint_head= InitPoint(size);行计为尝试更改变量。您必须在声明它时使用值初始化const变量。

尝试这样的事情:

//globals
static POINT head_of_list;
POINT* const mypoint_head = &head_of_list;

现在,您可以使用以下命令初始化列表:

mypoint_head->next= InitPoint(size-1);

列表头对象是静态声明的,因此它始终存在,您需要适当调整InitPoint参数。您还可以对另一个文件中的指针进行extern引用,而无需将其指向的对象直接访问(为了它的价值)。

答案 2 :(得分:2)

还没人建议:

int main(int argc, char *argv[])
{
    int size = 100;

    // cast address of mypoint_head to a non-const pointer:
    POINT ** nc_pmh = (POINT **)&mypoint_head;
    // use the address to set mypoint_head:
    (*nc_pmh) = InitPoint(size);
    //rest of code
}

这可能不适用于C ++,它可能无法为const对象提供空间。

顺便说一句:这通常不是好习惯。然而,在这种情况下,它运作良好。

顺便说一句:你要检查InitPoint()的回报,并采取相应的行动(可能会调用exit())。

答案 3 :(得分:1)

从全局声明中删除const限定符,并将rest_of_code声明为一个采用const限定版本指针的函数。

//globals
POINT * mypoint_head;

void rest_of_code(POINT* const mypoint_head)
{
    mypoint_head = NULL;    // this errors out now
}
int main(int argc, char *argv[])
{
    int size = 100;
    mypoint_head= InitPoint(size);   // no longer errors out
    //rest of code
    rest_of_code(mypoint_head);
}

答案 4 :(得分:1)

没有全局const指针作为其他所有内容的接口。

使用功能: -

static POINT * mypoint_head;

POINT* point_head()
{
    return mypoint_head;
}

答案 5 :(得分:0)

您必须在声明中使用初始化程序:

static POINT mypoint_data[100];
POINT * const mypoint_head = &mypoint_head;

然后更改您的InitPoint函数以获取指向数据空间的指针,而不是调用malloc并将其传递给mypoint_data

您还可以将extern POINT * const mypoint_head;粘贴到头文件中,以便可以在其他编译单元中访问。

答案 6 :(得分:0)

(假设c)const必须在声明时初始化,并且无法对它们进行求值。也许您可以使用const指针并使其指向您的头部并将其暴露给其余代码。 如果我必须实现,我可能会通过getListHead()函数公开变量并给它一些不起眼的名字:)

想知道用例是什么。即使它的头指针改变,我也会使我的列表工作。 (如果我有一个常量头,如果我必须删除头节点,我将不得不像数组一样移动元素)

答案 7 :(得分:0)

我无法相信没有人建议使用const_cast ..它对于常量指针也同样好。

const_cast<POINTER *>(mypoint_head) = InitPoint(size);

简单,没有额外的变量声明,没有。