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

时间:2010-04-17 06:25:00

标签: c static

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

例如:

int main()
{
  int a[]={1,2,3};
  int *p[]={a,a+1,a+2}; 
  ......
  return 0;
}

此代码显示非法初始化 - 为什么?以下代码有效:

int main()
{
   static int a[]={1,2,3};
   static int *p[]={a,a+1,a+2}; 
   ...
   return 0;
}

2 个答案:

答案 0 :(得分:8)

在C89(原始“ANSI C”)中,初始化列表中使用的值必须是“常量表达式”。一种常量表达式是地址常量,指向具有静态存储持续时间的对象的指针是地址常量。

但是,指向具有自动存储持续时间的对象的指针是地址常量(其值在编译时是未知的),因此不能在初始化列表中使用。

您只需要使数组a具有静态存储持续时间 - 以下内容也可以使用:

main()
{
  static int a[]={1,2,3};
  int *p[]={a,a+1,a+2}; 
  ......
}

C99放宽了对具有自动存储持续时间的对象的初始化者的限制(这就是为什么gcc可以使用它)。


为什么会这样?初始化列表通常用于初始化可能较大的对象,如数组或结构。每次输入函数时,必须重新初始化具有自动存储持续时间的对象,并且C89规则允许编译器写入通过发出简单的memcpy()调用来执行此初始化(使用静态“模板”源,这对应于初始化列表)。根据C99规则,编译器可能必须发出任意复杂的初始化代码块。

答案 1 :(得分:0)

使用Visual C,代码可以正常工作。但是,它会生成4级警告C4204,这意味着他们认为这是Microsoft特定的C标准扩展。正如caf和AndreyT所说,允许这一点并不是C标准的一部分。

编辑:使用C标准我的意思是C89。