簡單,但棘手的問題:使用static關鍵字聲明的數組:static是什麼,指針或整個數組?
void f() {
static int a[3] = {1, 2, 3};
...
什麼是靜態的嗎?指向數組或整個數組的指針?
任何人都可以指出我在C標準中的定義嗎?
謝謝!
簡單,但棘手的問題:使用static關鍵字聲明的數組:static是什麼,指針或整個數組?
void f() {
static int a[3] = {1, 2, 3};
...
什麼是靜態的嗎?指向數組或整個數組的指針?
任何人都可以指出我在C標準中的定義嗎?
謝謝!
從ISO C99標準(第6.2.1節「標識符的作用域」):
3如果一個文件範圍 標識符對象或功能 的聲明包含存儲類 符靜態的,標識符具有 內部linkage.22)
在您的例子它的a
標識符變爲靜態的(即,目標文件中的符號未導出)。
編輯:
對於非文件範圍靜態聲明(第6.2.4節,「對象的存儲持續時間」)
3,其標識符與外部或內部聯動 聲明 一個目的,或者與存儲級 說明符static有靜態存儲 持續時間。它的使用壽命是整個 程序的執行,其 存儲值在程序啓動前僅初始化一次, 。
我認爲這意味着在這種情況下數組本身變爲靜態,這是有道理的,因爲否則標識符將具有無效內容。
在代碼:
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
它適用於陣列。代碼中沒有指針。數組不是指針。
#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
你指的是什麼指針? – 2011-01-13 20:33:35
我指的是「a」指針(&a [0])。 – Silas 2011-01-13 20:34:49
在幾乎所有情況下`a`擴展的表達式&a [0]不是左值。它是一個地址而不是指針。只有一個標識符被定義,這是數組。由於沒有其他標識符,所以沒有什麼可以應用`static`。 – 2011-01-13 20:43:24