es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  ,

Answer

  1. Avatar for 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 la struct segment. La función new_segment toma un parámetro entero length que se utiliza para asignar memoria dinámicamente para la struct 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 la struct segment utilizando sizeof. El miembro count de la struct segment se establece en length 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 de N 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 una struct utilizando una combinación de malloc y sizeof.

Comments are closed.