¿Por qué mi programa falla en la segmentación cuando elimino la referencia a un puntero NULL dentro de malloc?

2 minutos de lectura

¿Por que mi programa falla en la segmentacion cuando elimino
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==0y estoy desreferenciando un NULL 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

1647713168 328 ¿Por que mi programa falla en la segmentacion cuando elimino
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 intentonces es equivalente a sizeof (int). Todo esto sucede en tiempo de compilación.

(Además, esto no es “dentro de malloc”.)

¿Por que mi programa falla en la segmentacion cuando elimino
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.

¿Por que mi programa falla en la segmentacion cuando elimino
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.

¿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