2011-01-13 3 views
6

semplice ma difficile domanda:array dichiarato con la parola chiave static: cosa è statico, il puntatore o l'intero array?

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

Qual è statico qui? Il puntatore all'array o all'intero array?

Qualcuno può indicarmi una definizione di quello nello standard C?

Grazie!

+2

Cosa puntatore ti riferisci? –

+0

Mi riferisco al puntatore "a" (& a [0]). – Silas

+3

L'espressione '& a [0]' a cui 'a' si espande in quasi tutti i contesti non è un lvalue. È un indirizzo e non un puntatore. C'è un solo identificatore definito e questo è l'array. Dato che non esiste un altro identificatore, non c'è nulla per applicare il 'static' a. –

risposta

6

Dalla norma ISO C99 (paragrafo 6.2.1, "Scopes di identificatori"):

3 Se la dichiarazione di un ambito di file identificatore di un oggetto o di una funzione contiene la classe di archiviazione specificatore static, l'identificatore ha linkage.22 interno)

nel tuo esempio è l'identificatore a che diventa statico (cioè il simbolo nel file oggetto non viene esportata).

EDIT:

Per dichiarazioni ambito diverso da un file statici (sezione 6.2.4, "durata di stoccaggio di oggetti")

3 Un oggetto cui identificatore è dichiarata con esterno o interno collegamento , oppure con lo specificatore della classe di memoria ha una durata di memorizzazione statica . La sua durata è l'intera esecuzione del programma e il suo valore memorizzato viene inizializzato una sola volta, prima dell'avvio del programma.

Prendo questo per indicare che la matrice stessa diventa statica in questo caso, il che ha senso, poiché l'identificatore avrebbe altrimenti contenuto non valido.

+0

Grazie per la tua risposta, ma ho modificato il post per circondarlo con una funzione. In realtà non è un identificatore dell'ambito del file ... – Silas

+0

@Silas: vedere la mia modifica – thkala

+0

Sì - l'"oggetto" in questo caso è l'array stesso, quindi è la matrice che ha durata di archiviazione statica. – caf

2

In codice:

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

tipo di puntatore non è, ma array di int. Tuttavia, viene automaticamente convertito in puntatore, ad es. in C standard:

Tranne quando è l'operando dell'operatore sizeof o unario e operatore, o è una stringa letterale utilizzata per inizializzare una matrice, viene convertita un'espressione con tipo '' array di tipo '' in un'espressione con tipo '' puntatore al tipo '' che punta all'elemento iniziale dell'oggetto array e non è un lvalue.

Quindi se a è array, che = {1, 2, 3} è l'inizializzazione, non un qualche tipo di array separato. Non so se è specificato esattamente da qualche parte, ma in questo senso è usato in tutto lo standard.

Modifica per chiarire la confusione da alcuni dei lettori: secondo norma di cui sopra, se si scrive:

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 
+4

Mi sono perso dove hai risposto alla domanda? –

+0

La domanda era: che cosa è statico qui? Il puntatore all'array o all'intero array? Ciò implica che static int a [3] -> a è solo statico int *, i dati effettivi (3 interi) non sono statici, la domanda riguardava proprio questo, l'archiviazione statica sembra essere chiara al richiedente. – peenut

+0

Agh ... Sei così ossessionato dal fatto che "a" sia un puntatore o meno che hai dimenticato di rispondere alla domanda. –

2

Si applica alla matrice. Non c'è alcun puntatore nel tuo codice. La matrice non è un puntatore.

#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(); 
     } 
} 

uscite

3 
4 
5 
6 
7 
+2

-1: puntatore IS dell'array errato, allineato all'heap, array non assegnato all'heap (con dimensione costante) non è puntatore, ma converte automaticamente in: quindi è quasi puntatore (nella maggior parte dei casi viene utilizzato come uno) – peenut

+1

@peenut : Cosa intendi per array ammassato? Perché è più un puntatore di un array assegnato in altro modo? –

+1

@peenut um ... i puntatori non sono matrici. Anche secondo quello che dici, questo array non è un puntatore. Inoltre, non capisco cosa sia una "matrice allocata nell'heap". –