2011-01-13 15 views
6

simple pero difícil pregunta: ¿matriz declarada con palabra clave estática: ¿qué es estático, el puntero o toda la matriz?

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

¿Qué es estática aquí? El puntero a la matriz o toda la matriz?

¿Alguien puede indicarme la definición de eso en el estándar C?

Gracias!

+2

Lo puntero se está refiriendo? –

+0

Me refiero al puntero "a" (y a [0]). – Silas

+3

La expresión '& a [0]' a la que 'a' se expande en casi todos los contextos no es un valor l. Es una dirección y no un puntero. Solo hay un identificador definido y esta es la matriz. Como no hay otro identificador, no hay nada para aplicar el 'static 'a. –

Respuesta

6

de la norma ISO C99 (sección 6.2.1, "Scopes de identificadores"):

3 Si la declaración de un ámbito de archivo identificador para un objeto o una función contiene la clase de almacenamiento especificador estática, el identificador tiene linkage.22 interna)

en su ejemplo es el identificador a que se convierte en estática (es decir, el símbolo en el archivo objeto no se exporta).

EDIT:

para las declaraciones de alcance no archivo estático (sección 6.2.4, "las duraciones de almacenamiento de objetos")

3 Un objeto cuyo identificador se declarado con vinculación externa o interna , o con el especificador de clase de almacenamiento estático tiene almacenamiento estático duración. Su duración es la ejecución completa del programa y su valor almacenado se inicializa solo una vez, antes del inicio del programa.

Supongo que esto significa que la matriz se vuelve estática en este caso, lo que tiene sentido, ya que el identificador tendría contenido no válido en caso contrario.

+0

Gracias por su respuesta, pero edité la publicación para rodearla con una función. En realidad, no es un identificador de alcance de archivo ... – Silas

+0

@Silas: vea mi edición – thkala

+0

Sí - el "objeto" en este caso es la matriz en sí misma, por lo que es la matriz que tiene una duración de almacenamiento estática. – caf

2

En código:

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

Tipo de puntero no está, pero matriz de int. Sin embargo, se convierte automáticamente en puntero, p. en estándar C:

Excepto cuando es el operando del operador sizeof o el operador unario, o es un literal de cadena usado para inicializar una matriz, una expresión que tiene tipo '' matriz de tipo '' se convierte a una expresión con el tipo '' puntero al tipo '' que apunta al elemento inicial del objeto de la matriz y no es un valor l.

Así que si a es una matriz, entonces = {1, 2, 3} es su inicialización, no un tipo de matriz separada. No sé si está especificado exactamente en alguna parte, pero en este sentido se usa en todo el estándar.

Editar para aclarar la confusión por parte de los lectores: de acuerdo con la norma citada, si escribe:

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

¿Echaba de menos dónde respondió la pregunta que se hizo? –

+0

La pregunta fue: ¿Qué es estático aquí? El puntero a la matriz o toda la matriz? Eso implica que estática int a [3] -> a es estática int *, los datos reales (3 enteros) no son estáticos, la pregunta fue sobre eso, el almacenamiento estático parece ser claro para el asker. – peenut

+0

Agh ... Estás tan obsesionado con si "a" es un puntero o no que olvidaste responder la pregunta. –

2

Se aplica a la matriz. No hay puntero en tu código. Array no es puntero.

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

salidas

3 
4 
5 
6 
7 
+2

-1: el array IS incorrecto asignado por el montón, el conjunto no asignado al montón (con tamaño constante) no es un puntero, sino que se convierte automáticamente en - por lo que es casi puntero (en la mayoría de los casos se usa como uno) – peenut

+1

@peenut : ¿Qué quiere decir con una matriz asignada en el montón? ¿Por qué es más un puntero que una matriz asignada de otra manera? –

+1

@peenut um ... los punteros no son matrices. Incluso de acuerdo con lo que dices, esta matriz no es un puntero. Tampoco entiendo qué es una "matriz asignada en el montón". –

Cuestiones relacionadas