静态指针,初始化不是常量?

时间:2016-10-20 13:34:16

标签: c pointers

我认为静态指针与其他静态变量一样,初始化为一个值,它具有相同的值直到结束,就像在静态指针中保存相同的地址一样。但在这种情况下,编译器会抛出错误

//initialiser element is not constant      static int *a = &b[0];

#include <stdio.h>
int main(void) 
{
    int b[2];

    static int *a = &b[0];  // removing static the program works well.
    printf("%u",a);

    a = &b[1];
    printf("%u",a);

    return 0;
}

那么静态指针的用途是什么?

3 个答案:

答案 0 :(得分:4)

在C中,您的代码没有意义。 b具有自动存储持续时间,因此每次遇到main时,概念上都会有不同的地址。 static只会被初始化一次,而在main的后续调用中,它可能会指向无效的内容。

但是,这是有趣的一点,在C ++中它应该才有意义,因为你不允许自己调用main:你这样做是 undefined 。所以推断这一点是编译器应该知道staticmain的生命周期内有效,并编译代码!也许C ++标准中有些内容明确禁止这一点。

在C中,您可以递归调用main(甚至是隐式递归),因此编译器应该发出错误。

答案 1 :(得分:3)

您有两种选择。将静态添加到int b[2],或将其从int *a中删除。 b的地址不是静态的。它是可变的,因为b是一个具有自动存储的变量。

答案 2 :(得分:0)

static vs const可能存在混淆。

Const变量在初始化之前将保持相同的值,直到它们超出范围,除非使用const_cast<>,尽管@Bathsheba在评论中提到,在变量上使用const_cast<>声明的const是未定义的。

静态意味着它将在第一次到达时初始化,但在程序执行结束之前不会超出范围。