Siempre he programado en Java, que es probablemente por qué estoy tan confundido acerca de esto:Estoy muy confundido acerca de malloc() y calloc() en C
En Java declaro un puntero:
int[] array
e inicializar o asignarla parte de la memoria:
int[] array = {0,1,0}
int[] array = new int[3]
Ahora, en C, que es todo tan confuso. Al principio pensé que era tan fácil como la que se declara que:
int array[]
e inicializar o cederla parte de la memoria:
int array[] = {0,1,0}
int array[] = malloc(3*sizeof(int))
int array[] = calloc(3,sizeof(int))
A menos que me equivoque, todo lo anterior es equivalente Java-C , ¿derecho?
Entonces, hoy me encontré con un código en el que me encontré con lo siguiente:
pthread_t tid[MAX_OPS];
y algunas líneas de abajo, sin ningún tipo de inicialización ...
pthread_create(&tid[0],NULL,mou_usuari,(void *) 0);
sorprendente (al menos a yo), el código funciona! ¡Al menos en Java, devolvería una buena "NullPointerException"!
Así, en orden:
Estoy en lo correcto con todas las "traducciones" Java-C?
¿Por qué funciona ese código?
¿Hay alguna diferencia entre usar
malloc(n*sizeof(int))
ycalloc(n,sizeof(int))
?
Gracias de antemano
El 1er párrafo tiene algunas afirmaciones peligrosamente ambiguas. El OP no intentaba asignar memoria a una matriz, estaba intentando asignar un (vacío *), el retorno de malloc() a una matriz, y si esa matriz había sido una int * Matriz [i], probablemente en una para {} loop, funcionaría bien, y es la base de cómo las matrices dinámicas y multidimensionales se asignan fuera del montón. Además, C99 admite matrices de tamaño variable asignadas fuera de la pila, una característica que usan pocos programadores en C, la mayoría prefiere alloca(), incluido yo mismo. http://stackoverflow.com/q/1018853/2548100 – user2548100
calloc() es prácticamente memset (malloc (n * mysize), 0, (n * mysize)). Especialmente porque C usa cadenas terminadas en nulo, calloc() es muy útil, especialmente cuando se ven cadenas en un depurador, que típicamente muestra la cadena solo hasta el terminador nulo. Si solo está declarando con C, use calloc en lugar de malloc, le ahorrará la posibilidad de cometer muchos errores de cadena C no terminados que pueden, y probablemente bloquearán, su programa. Para el código de producción/liberación, use calloc() solo cuando realmente necesite inicializar el búfer/matriz/vector a (_int8) 0. – user2548100
Solo para concluir, y para completar, una matriz ES un puntero. De hecho, cualquier nombre de matriz en C es exactamente, precisamente, un puntero a la base del primer byte del primer objeto en la matriz, y nada más. Para las personas que vienen de Java,.Net, etc., es útil saber que C mantiene el tipo de objetos/variables completamente separados del almacenamiento asignado para mantenerlos. Es por eso que puedes lanzar un puntero como int, crear UNIONs, etc. Muy, muy flexible, pero peligroso para noobies. Cuando asigna una matriz int, solo almacena en una ubicación. Puedes poner lo que quieras en ese almacenamiento. – user2548100