Uso este estilo malloc todo el tiempo.
int *rc = 0;
rc = malloc(sizeof(*rc));
Sin embargo, no detecta fallas a pesar de que cuando llamo sizeof(*rc)
yo asumo eso rc==0
y estoy desreferenciando un NULL
puntero.
LlámameNorma
Uso este estilo malloc todo el tiempo.
int *rc = 0;
rc = malloc(sizeof(*rc));
Sin embargo, no detecta fallas a pesar de que cuando llamo sizeof(*rc)
yo asumo eso rc==0
y estoy desreferenciando un NULL
puntero.
Hormiga
Realmente no estás desreferenciando nada. el argumento de sizeof
no se evalúa, a menos que sea un VLA. El lenguaje permite explícitamente poner cualquier “basura” que desee como argumento de sizeof
. El lenguaje garantiza que no evaluará nada, solo realizará un análisis en tiempo de compilación del tipo de expresión. Por ejemplo, expresión sizeof i++
se garantiza que no cambiará el valor de i
.
La única excepción a esa regla son las matrices de longitud variable. El resultado de sizeof
para VLA es un valor de tiempo de ejecución, lo que significa que el argumento se evalúa y debe ser válido.
¿No está realmente sin especificar qué se evalúa, si es que se evalúa algo, en el caso de VLA?
– R.. GitHub DEJA DE AYUDAR A ICE
26 de noviembre de 2012 a las 23:36
@R..: C99 establece explícitamente que lo es. Por ejemplo, en el caso de VLA int a[n][n]
esperaría la expresión sizeof a[i++]
incrementar i
. no veo usar sizeof
con efectos secundarios como una buena práctica de programación, pero sin embargo en tales casos está ahí.
– Ant
27 de noviembre de 2012 a las 0:52
De hecho, me equivoqué en eso. Buen ejemplo inteligente; en general, la mayoría de las expresiones que podrían tener efectos secundarios no tienen tipo VLA (aunque pueden involucrar VLA como operandos). Usted señaló uno de los pocos ejemplos donde hay una expresión con efectos secundarios cuyo tipo es un tipo VLA.
– R.. GitHub DEJA DE AYUDAR A ICE
27 de noviembre de 2012 a las 1:55
los sizeof
El operador en realidad no evalúa su operando, solo mira su tipo. El tipo de *rc
es int
entonces es equivalente a sizeof (int)
. Todo esto sucede en tiempo de compilación.
(Además, esto no es “dentro de malloc”.)
soy real
En realidad, no está eliminando la referencia de un puntero, le está preguntando al compilador el tamaño del tipo rc
puntos a. En este caso sizeof
se resuelve en tiempo de compilación, cuando no hay punteros.
Corbin
Eso es equivalente a sizeof(type of *rc)
(en otras palabras, sizeof(int)
), no sizeof(data stored at the location pointed to by rc)
. sizeof()
trabaja en tiposno valores.
sizeof nunca considera los datos reales, solo el tipo, por lo que no hay necesidad (y no tendría sentido) de deferenciar el puntero.
Posible duplicado de Is sizeof(*ptr) comportamiento indefinido al apuntar a memoria no válida?
– Pato Donald
31 de julio de 2018 a las 2:48