简单但棘手的问题:
void f() {
static int a[3] = {1, 2, 3};
...
这里的静态是什么?指向数组的指针还是整个数组?
有人能指出我在C标准中的定义吗?
谢谢!
答案 0 :(得分:6)
根据ISO C99标准(第6.2.1节“标识符的范围”):
3如果声明文件范围 对象或函数的标识符 包含存储类 说明符静态,标识符有 内部联系.22)
在您的示例中,a
标识符变为静态(即,不导出目标文件中的符号)。
编辑:
对于非文件范围的静态声明(第6.2.4节“对象的存储持续时间”)
3标识符为的对象 用外部或内部声明 联系,或与存储类 说明符static具有静态存储 持续时间。它的一生就是整个 程序的执行及其执行 存储值只初始化一次, 在程序启动之前。
我认为这意味着数组本身在这种情况下变为静态,这是有道理的,因为标识符将具有无效内容。
答案 1 :(得分:2)
在代码中:
static int a[3] = {1, 2, 3};
a的类型不是指针,而是int的数组。但是,它会自动转换为指针,例如在C标准中:
除非它是sizeof运算符或一元&运算符的操作数。运算符,或者是用于初始化数组的字符串文字,具有类型''数组类型''的表达式将转换为类型为''指向类型'的指针的表达式,指向数组对象的初始元素,不是左值。
因此,如果a是数组,则= {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 :(得分: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