#include<alloc.h>
#define MAXROW 3
#define MAXCOL 4
main() {
int (*p)[MAXCOL];
p = (int (*)[MAXCOL]) malloc(MAXROW*(sizeof(*p));
}
¿Cuántos bytes se asignan en el proceso?
p es un puntero, por lo que va a ocupar sizeof(int(*)[MAXCOL])
en la pila, lo que podría parecer desalentadora, pero es casi siempre el mismo que sizeof(void*)
, sizeof(int*)
o cualquier otro puntero. Obviamente, los tamaños de puntero son los que le dan a las aplicaciones su clasificación como 16-, 32-, 64-etc. bits, y este puntero tendrá el tamaño correspondiente.
entonces p es señalado en algún memoria obtenida de malloc
...
malloc(MAXROW * sizeof(*p))
sizeof(*p)
es el tamaño de la matriz int
que p
puntos a, a saber sizeof(int) * MAXCOL
, por lo que tenemos
malloc(MAXROW * (sizeof(int) * MAXCOL))
solicitado desde el montón. Para propósitos ilustrativos, si asumimos el tamaño común de 32 bits int
, estamos viendo 48 bytes. El uso real puede redondearse a lo que sea que se sientan las rutinas de pila (las rutinas de pila a menudo usan "cubos" de tamaño fijo para acelerar sus operaciones).
Para confirmar esta expectativa, simplemente sustituir una función de registro de malloc()
:
#include <stdio.h>
#define MAXROW 3
#define MAXCOL 4
void* our_malloc(size_t n)
{
printf("malloc(%ld)\n", n);
return 0;
}
int main()
{
int (*p)[MAXCOL];
p = (int (*)[MAXCOL]) our_malloc(MAXROW*(sizeof(*p)));
}
salida en mi máquina Linux:
malloc(48)
El hecho de que puntero devuelto de malloc se convierte al tipo de p doesn' t afecta la cantidad de asignación de memoria realizada.
Como R observa agudamente, la falta de un prototipo malloc
haría que el compilador puede esperar para volver malloc
int
en lugar de la realidad-devuelto void*
. En la práctica, es probable que el tamaño más bajo de (int) bytes del puntero sobreviva a la conversión, y si sizeof (void *) pasó a ser igual a sizeof (int), o - aún más tenue - la memoria del montón pasa a comenzar en una dirección representable en un int
a pesar de que el tamaño de los punteros es mayor (es decir, todos los bits truncados eran 0 de todos modos), la desreferencia posterior del puntero podría funcionar. Plug barato: C++ no se compilará a menos que se vea el prototipo.
Dicho esto, tal vez su alloc.h contiene un prototipo malloc ... No tengo una alloc.h, así que supongo que es no estándar.
Cualquier programa también asignará memoria para muchas otras cosas, como un marco de pila que proporciona algún contexto dentro del cual se puede llamar a main(). La cantidad de memoria para que varía con el compilador, la versión del compilador, sistema operativo, etc ..
El que hizo esta pregunta de la entrevista, obviamente, nunca trató de compilar el código realidad. –
¿Estás seguro? Parece que podría compilarse en algunos sistemas basura ... –
No sin un ')' adicional –