为什么我们使用带指针数组的静态?静态指针与指针数组之间的关系是什么?
例如:
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;
}
答案 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。