Comportamiento de sizeof en matrices de longitud variable (solo C)

4 minutos de lectura

avatar de usuario
CCoder

mi pregunta es como exactamente sizeof() se comporta cuando el argumento pasado es un matriz dinámica matriz de longitud variable.

Consideremos un ejemplo:

int fun(int num_of_chars)
{
    char name_arr[num_of_chars] = {0};

    /* Do something*/

    return sizeof(name_arr);
}

En este ejemplo, es obvio que el valor de retorno no es una constante de tiempo de compilación. Debido a que el tamaño depende del valor de tiempo de ejecución de num_of_chars.

Una cita del estándar C99 (6.5.3.4):

los sizeof El operador produce el tamaño (en bytes) de su operando, que puede ser una expresión o el nombre entre paréntesis de un tipo. El tamaño se determina a partir del tipo de operando. El resultado es un número entero. Si el tipo del operando es un tipo de matriz de longitud variable, se evalúa el operando; de lo contrario, el operando no se evalúa y el resultado es una constante entera.

Lo que puedo entender de [….the operand is evaluated….] es que cuando el argumento pasó por sizeof() es un matriz dinámica matriz de longitud variable, sizeof() ‘se comporta como’ una función y no como un operador.

¿Es correcto mi entendimiento?

  • sizeof() sigue siendo un operador; simplemente ya no genera una constante de tiempo de compilación cuando el argumento es una matriz de longitud variable.

    –Jonathan Leffler

    21 de febrero de 2013 a las 6:38

  • ¿Tu código compila? Yo tengo un variable-sized object may not be initialized error

    – Ciprian Tomoiaga

    30/09/2014 a las 16:59

avatar de usuario
Jan Hudec

Todavía se comporta como un operador. Cast también es operador y también evalúa su argumento y también lo hace * o & . Ser un operador es una categoría sintáctica. Eso no cambia.

La distinción importante es que se comporta como expresión mientras que en otros casos se comporta como constante.


Actualización: Comenté a continuación que no veo por qué la evaluación marca la diferencia, pero ahora me doy cuenta de que hay dos formas en que puede escribir sizeof con una matriz de longitud variable. O puede pasar la variable declarada como matriz de longitud variable:

int a[x];
sizeof(a)

en cuyo caso evaluando a de hecho no hace ninguna diferencia. Pero también puedes usar un escribe como argumento, que sería

sizeof(int[x])

y en este caso el resultado es x * sizeof(int) y x debe ser evaluado. Supongo que es por eso que la especificación lo menciona.

  • “y también evalúa su argumento” – no, no lo hace. La expresión pasó a sizeof() no se evalúa.

    usuario529758

    21 de febrero de 2013 a las 6:42

  • @H2CO3: Por favor, lea la pregunta. Cita el estándar que dice que el operando se evalúa si es una matriz de longitud variable. Dicho esto, la única expresión del tipo de matriz de longitud variable en C99 es tan variable declarada y evaluada que no tiene un efecto observable, por lo que no estoy seguro de por qué se hace la distinción (C ++ es otra cuestión, pero incluso C ++ 11 no incluye esto rasgo).

    – Jan Hudec

    21 de febrero de 2013 a las 6:52

  • @H2CO3: De hecho, ahora me di cuenta de que cuando pasas una matriz de longitud variable escribe para sizeof, la expresión es evaluada y con posibles efectos secundarios observables. Actualicé la respuesta.

    – Jan Hudec

    22 de febrero de 2013 a las 8:24

  • La evaluación puede marcar una diferencia arbitrariamente enorme si la expresión bajo sizeof tiene efectos secundarios. Me gusta int a[x][x], i = 0; sizeof a[i++];. Variable i se supone que debe incrementarse.

    – Ant

    22 de julio de 2016 a las 0:38

Mi pregunta es cómo se comporta exactamente sizeof() cuando el argumento pasado es una matriz dinámica.

  1. Bueno, más bien te refieres a una “matriz de longitud variable” (VLA).

  2. Se comporta casi exactamente igual: devuelve el tamaño de la matriz en bytes.

sizeof() ‘se comporta como’ una función y no como un operador.

No, nunca fue una función. Lo único que cambia es que, si se usa en VLA, este operador no genera una constante de tiempo de compilación; de lo contrario, sí lo hace.

  • Porque algunos pueblos están frustrados aquí.

    –Grijesh Chauhan

    01/08/2013 a las 20:24


¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad