为什么我们使用带指针数组的静态?静态指针与指针数组之间有什么关系?
例如:
int main()
{
int a[]={1,2,3};
int *p[]={a,a+1,a+2};
......
return 0;
}
Run Code Online (Sandbox Code Playgroud)
此代码显示非法初始化 - 为什么?以下代码有效:
int main()
{
static int a[]={1,2,3};
static int *p[]={a,a+1,a+2};
...
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在C89(原始"ANSI C")中,初始化列表中使用的值必须是"常量表达式".一种常量表达式是地址常量,指向具有静态存储持续时间的对象的指针是地址常量.
但是,指向具有自动存储持续时间的对象的指针不是地址常量(其值在编译时是未知的),因此不能在初始化列表中使用.
您只需要使阵列a具有静态存储持续时间 - 以下也可以使用:
main()
{
static int a[]={1,2,3};
int *p[]={a,a+1,a+2};
......
}
Run Code Online (Sandbox Code Playgroud)
C99放宽了对具有自动存储持续时间的对象的初始化的限制(这就是为什么gcc可以使用它).
为什么会这样?初始化列表通常用于初始化可能较大的对象,如数组或结构.每次输入函数时,必须重新初始化具有自动存储持续时间的对象,并且C89规则允许编译器写入通过发出简单memcpy()调用来执行此初始化(使用静态"模板",其对应于初始化列表).根据C99规则,编译器可能必须发出任意复杂的初始化代码块.