Uso extraño de aparatos rizados en C


Lo siento por la simple pregunta, pero estoy de vacaciones leyendo un libro en core audio, y no tengo mis libros C u Objective C conmigo...

¿Qué están haciendo las llaves en esta definición de variable?

MyRecorder recorder = {0};
Author: Shiplu Mokaddim, 2012-01-05

5 answers

Suponiendo que MyRecorder es un struct, este establece a cada miembro en su respectiva representación de cero (0 para enteros, NULL para punteros, etc.).

En realidad esto también funciona en todos los otros tipos de datos como int, double, punteros, matrices, estructuras anidadas,..., todo lo que puedas imaginar (¡gracias a pmg por señalar esto!)

ACTUALIZACIÓN: Una cita extraída del sitio web vinculado anteriormente, citando el borrador final de C99:

[6.7.8.21] Si hay hay menos inicializadores en una lista cerrada con llaves que hay elementos o miembros de un agregado, [...] el resto de la el agregado se inicializará implícitamente igual que los objetos que tener una duración de almacenamiento estático.

 23
Author: Niklas B.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-05 17:37:02

Su inicialización todos los miembros de recorder estructura a 0 de acuerdo con el estándar C99. Podría parecer que inicializa cada bit de la estructura con 0 bits. Pero eso no es cierto para todos los compiladores.

Ver este código de ejemplo,

#include<stdio.h>

struct s {
    int i;
    unsigned long l;
    double d;
};

int main(){
    struct s es = {0};
    printf("%d\n", es.i);
    printf("%lu\n", es.l);
    printf("%f\n", es.d);
    return 0;
}

Esta es la salida.

$ ./a.out 
0
0
0.000000
 9
Author: Shiplu Mokaddim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-05 17:40:01
 4
Author: dasblinkenlight,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-05 15:27:12

En realidad, no inicia todos los elementos de la estructura, solo el primero. Pero, los otros se inicializan automáticamente con 0 porque esto es lo que el estándar C pide hacer.

Si pones: MyRecorder recorder = {3};

El primer elemento será 3 y los demás serán 0.

 3
Author: Bruno Soares,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-05 17:30:37

MyRecorder podría ser uno de los siguientes y usted está tratando de inicializar todos los elementos de que con cero

typedef struct _MyRecorder1 {
    int i;
    int j;
    int k;
}MyRecorder1;

typedef int MyRecorder2[3];
 0
Author: Sangeeth Saravanaraj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-05 15:44:05