Declaraciones incompletas en C
Estoy buscando una explicación para la siguiente afirmación sobre declaradores de matrices en este libro.
El concepto de tipos compuestos (§6.1.2.6) se introdujo para proporcionar la acumulación de información a partir de declaraciones incompletas, como las declaraciones de matrices con tamaño faltante y las declaraciones de funciones con prototipo faltante (declaraciones de argumento). Por lo tanto, se dice que los declaradores de tipo especifican tipos compatibles si están de acuerdo, excepto por el hecho de que uno proporciona menos información de este tipo que el otro.
La declaración de matrices de longitud 0 es inválida, según el principio general de no proporcionar objetos de longitud 0. El único uso común de esta construcción ha sido en la declaración de matrices de tamaño de variable asignada dinámicamente, como:
struct segment {
short int count;
char c[N];
};
struct segment * new_segment( const int length ) {
struct segment * result;
result = malloc( sizeof segment + (length-N) );
result->count = length;
return result;
}
En tal uso, N sería 0 y (length-N) se escribiría como length. Pero este paradigma también funciona si N es 1.
Específicamente, estoy interesado en cuál es la motivación de este párrafo y en comprender ese fragmento de código. ¿De dónde viene el N
en la función new_segment
?
davy.ai
El párrafo discute el concepto de tipos compuestos y cómo permiten la acumulación de información de declaraciones incompletas. El ejemplo dado es para declaraciones de matrices con tamaño faltante y declaraciones de funciones con prototipo faltante. Los declaradores de tipo pueden especificar tipos compatibles si están de acuerdo excepto por el hecho de que uno proporciona menos información que el otro.
El párrafo luego afirma que la declaración de matrices de longitud 0 es inválida porque no proporciona objetos de longitud 0. El único uso común de esta construcción es en la declaración de matrices de tamaño variable asignadas dinámicamente.
El fragmento de código proporcionado es un ejemplo de este uso.
N
es una constante que representa el tamaño de la matriz de caracteres en lastruct segment
. La funciónnew_segment
toma un parámetro enterolength
que se utiliza para asignar memoria dinámicamente para lastruct segment
y la matriz de caracteres. El tamaño de la matriz de caracteres se calcula como(length-N)
y se agrega al tamaño de lastruct segment
utilizandosizeof
. El miembrocount
de lastruct segment
se establece enlength
y la función devuelve un puntero a la memoria recién asignada.En este ejemplo,
N
es una constante que representa el tamaño de la matriz de caracteres. El valor deN
no se da en el fragmento de código, pero se supone que está definido en otro lugar del código. El propósito del código es demostrar cómo asignar memoria dinámicamente para una matriz de tamaño variable dentro de unastruct
utilizando una combinación demalloc
ysizeof
.