programa lenguaje funciones estructuras estructura datos cuál con arreglo array c struct initialization member

lenguaje - ¿Por qué no podemos inicializar miembros dentro de una estructura?



typedef struct en c (6)

¿Por qué no podemos inicializar miembros dentro de una estructura?

ejemplo:

struct s { int i = 10; };


Como dijiste, es solo un miembro, no una variable. Cuando declara una variable, el compilador también proporcionará espacio de memoria para aquellas variables donde puede poner valores. En el caso de un miembro de una estructura, el compilador no le está dando espacio de memoria, por lo que no puede asignar valores a los miembros de la estructura a menos que cree una variable de ese tipo de estructura.


La respuesta directa se debe a que la definición de estructura declara un tipo y no una variable que se puede inicializar. Tu ejemplo es:

struct s { int i=10; };

Esto no declara ninguna variable; define un tipo. Para declarar una variable, debe agregar un nombre entre } y el ; , y luego lo inicializaría después:

struct s { int i; } t = { 10 };

Como observó Checkers, en C99, también puede usar inicializadores designados (lo cual es una mejora maravillosa: un día, C se pondrá al día con las otras características que Fortran 66 tenía para la inicialización de datos, principalmente repitiendo inicializadores un número de veces especificado). Con esta estructura simple, no hay beneficio. Si tiene una estructura con, digamos, 20 miembros y solo necesita inicializar una de ellas (supongamos que tiene un indicador que indica que el resto de la estructura está, o no, inicializado), es más útil:

struct s { int i; } t = { .i = 10 };

Esta notación también se puede usar para inicializar uniones, para elegir qué elemento de la unión se inicializa.


No podemos inicializar porque cuando declaramos cualquier estructura de lo que realmente hacemos, solo informa al compilador sobre su presencia, es decir, no hay memoria asignada para eso y si inicializamos un miembro sin memoria para eso. Normalmente, lo que sucede cuando inicializamos cualquier variable depende del lugar donde declaramos que el compilador de variables asigna memoria para esa variable.

int a = 10;

  • si es automático que en la memoria de la pila va a asignar
  • si es global que en las secciones de datos la memoria va a asignar

Entonces, ¿qué memoria se requiere para contener esos datos, pero en el caso de la estructura no hay memoria, por lo que no es posible inicializarla?


Si desea inicializar miembros no estáticos en la declaración de struct :

En C ++ (no en C), las structs son casi sinónimos de las clases y pueden tener miembros inicializados en el constructor.

struct s { int i; s(): i(10) { } };

Si quieres inicializar una instancia :

En C o C ++:

struct s { int i; }; ... struct s s_instance = { 10 };

C99 también tiene una función llamada inicializadores designados:

struct s { int i; }; ... struct s s_instance = { .i = 10, };

También hay una extensión GNU C que es muy similar a los inicializadores designados C99, pero es mejor usar algo más portátil:

struct s s_instance = { i: 10, };


Tenga en cuenta que en C ++ 11, ahora se permite la siguiente declaración:

struct s { int i = 10; };

Esta es una vieja pregunta, pero ocupa un lugar destacado en Google y podría ser aclarada.


Editar: La pregunta originalmente fue etiquetada como c++ pero el póster dijo que se trata de c así que volví a etiquetar la pregunta, pero estoy dejando la respuesta ...

En C ++ una struct es solo una class que tiene valores predeterminados para public y no para miembros y herencia.

C ++ solo permite que static const miembros integrales static const sean inicializados en línea, otros miembros deben inicializarse en el constructor, o si la struct es un POD en una lista de inicialización (cuando se declara la variable).

struct bad { static int answer = 42; // Error! not const const char* question = "what is life?"; // Error! not const or integral }; struct good { static const int answer = 42; // OK const char* question; good() : question("what is life?") // initialization list { } }; struct pod { // plain old data int answer; const char* question; }; pod p = { 42, "what is life?" };