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

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

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 comstackción. Porque el tamaño depende del valor del tiempo de num_of_chars de num_of_chars .

Una cita del estándar C99 (6.5.3.4):

El operador sizeof 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 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 […. el operando es evaluado …] es que cuando el argumento pasado para sizeof() es una matriz de longitud variable de matriz dinámica , sizeof() ‘se comporta como’ una función y no como una operador .

¿Es mi entendimiento correcto?

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 hace la diferencia, pero ahora me di cuenta de que hay dos maneras de escribir sizeof con una matriz de longitud variable. O puede pasar la variable declarada como variedad de longitud variable:

 int a[x]; sizeof(a) 

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

 sizeof(int[x]) 

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

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

  1. Bueno, prefieres 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.

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