为什么我们使用带指针数组的静态?

ram*_*mya 2 c static

为什么我们使用带指针数组的静态?静态指针与指针数组之间有什么关系?

例如:

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)

caf*_*caf 8

在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规则,编译器可能必须发出任意复杂的初始化代码块.