2011-01-13 64 views
6

简单,但棘手的问题:使用static关键字声明的数组:static是什么,指针或整个数组?

void f() { 
    static int a[3] = {1, 2, 3}; 
    ... 

什么是静态的吗?指向数组或整个数组的指针?

任何人都可以指出我在C标准中的定义吗?

谢谢!

+2

你指的是什么指针? – 2011-01-13 20:33:35

+0

我指的是“a”指针(&a [0])。 – Silas 2011-01-13 20:34:49

+3

在几乎所有情况下`a`扩展的表达式&a [0]不是左值。它是一个地址而不是指针。只有一个标识符被定义,这是数组。由于没有其他标识符,所以没有什么可以应用`static`。 – 2011-01-13 20:43:24

回答

6

从ISO C99标准(第6.2.1节“标识符的作用域”):

3如果一个文件范围 标识符对象或功能 的声明包含存储类 符静态的,标识符具有 内部linkage.22)

在您的例子它的a标识符变为静态的(即,目标文件中的符号未导出)。

编辑:

对于非文件范围静态声明(第6.2.4节,“对象的存储持续时间”)

3,其标识符与外部或内部联动 声明 一个目的,或者与存储级 说明符static有静态存储 持续时间。它的使用寿命是整个 程序的执行,其 存储值在程序启动前仅初始化一次, 。

我认为这意味着在这种情况下数组本身变为静态,这是有道理的,因为否则标识符将具有无效内容。

2

在代码:

static int a[3] = {1, 2, 3}; 

键入一个不指针,但为int阵列。然而,它被自动转换成指针,例如,在C标准中:

除非它是sizeof运算符或一元运算符的操作数,或者是用于初始化数组的字符串文字,则具有类型'''数组类型'的表达式将转换为类型为''指向类型''的表达式指向数组对象的初始元素,并且不是左值。

所以,如果一个数组,比= {1,2,3}是它的初始化,而不是某种单独的数组。我不知道它是否指定在某个地方,但从这个意义上讲,它贯穿整个标准。

编辑一些读者的清理混乱:根据引用标准,如果你写:

int arr[4] = { }; 
arr[0] = 1; //arr here has here type int* 
size_t sz = sizeof(arr); //here it is not type int*, sizeof is exception 
2

它适用于阵列。代码中没有指针。数组不是指针。

#include <stdlib.h> 
#include <stdio.h> 

void f() { 
    static int a[3] = {1, 2, 3}; 
     a[1]++; 
     printf("%d\n", a[1]); 
} 

main() 
{ 
     int i; 
     for (i = 0; i < 5; i++) 
     { 
       f(); 
     } 
} 

输出

3 
4 
5 
6 
7