Entradas

Mostrando entradas de octubre, 2011

malloc vs calloc

Anteriormente en la segunda parte de punteros hablé acerca de cómo crear arrays dinámicos. Vimos la importancia de la función malloc() en este proceso. Sin embargo existen otras dos funciones complementarias a malloc() . Estas funciones son calloc() y realloc() . Para comenzar a ver las diferencias entre estas funciones veremos sus definiciones: - void *malloc(size_t size); - void *calloc(size_t nmemb, size_t size); - void *realloc(void *ptr, size_t size); Primero hablaré de las diferencias entre malloc y calloc . Vimos anteriormente que gracias a malloc() obteníamos el puntero que nos daba la dirección del bloque de memoria reservado dinámicamente. Sin embargo, malloc() no inicializa el contenido de este bloque de memoria. Por otra parte calloc() cumple la misma función que malloc (), con una diferencia: calloc() si inicializa a 0 el contenido de cada elemento del array dinámico. Podemos apreciar como en la definición de calloc() el primer parámetro es el nº de elem

Punteros C Parte 2

Imagen
Bien, como lo prometido es deuda voy a escribir una segunda parte acerca de punteros ( Parte 1 y aclaraciones ). Bien en esta segunda parte me dispondré a hablar acerca de otro modo de acceso a ' struct ' con punteros (en lugar de " (*var).varStr "). Además hablaremos de la gestión dinámica de memoria. Esta gestión se realiza mediante los punteros. En particular veremos arrays de datos dinámicos. A la hora de realizar pilas, colas, árboles y demás estructuras de datos se debería ampliar con temas particulares. Para todos los que ya conozcáis la teoría acerca de estas estructuras saber que la referencia al siguiente (siguientes, anterior) elemento (o nodo) se realiza mediante ' struct ' que contienen punteros del mismo tipo de la ' struct '. Con lo visto hasta ahora cabe destacar la versatilidad de los punteros. Hemos visto ciertas utilidades de los punteros que nos pueden resultar muy útiles (el paso por referencia). Además en esta segund

Función a Ensamblador

Imagen
Antes de continuar con los punteros me gustaría ver como una función, que puede parecer simple, puede cambiar mucho a la hora de transformar su código a ensamblador. Como curiosidad usaré el ensamblador de MIPS32. En esta entrada no me parare a explicar el significado de todas las instrucciones de ensamblador, es más para apreciar la interpretación de nuestros códigos. Sin embargo me parece interesante ver esto pues el ensamblador es un lenguaje de bajo nivel. La función que me dispongo a interpretar es una de las comunes como ejercicio de programación en clase. Además es uno de los ejemplos de función recursiva, esta es la función de factorial. Veamos un ejemplo de un programa simple que emplea esta función de una manera sencilla: Como vemos es algo sencillo. Unas pocas líneas de código y con eso hemos conseguido este pequeño programa que calcula un número factorial recursivamente.Pero esto se complica un poco más cuando pasa a ensamblador. Veamos que ocurre en ensamblador: Po

Aclaraciones de Punteros C

Imagen
Me gustaría hacer una serie de aclaraciones acerca de los punteros. Son cosas que quizás no quedasen demasiado claras en la primera parte de punteros en C . A raíz de ciertas preguntas y después de releer la anterior entrada he decidido detenerme más en el concepto y uso de punteros. En primer lugar me gustaría hablar acerca de que es un puntero . Un puntero es una variable que almacena una dirección de memoria . Desde esta variable podemos acceder al valor almacenado en la dirección de memoria apuntada. Debemos especificar el tipo de valor que contiene la dirección apuntada (int, double, char,...), esto se realiza en la declaración del puntero. El puntero se debe declarar (tipo) *nombrePuntero, ejemplo: int *punt ;  Para entender este concepto lo mejor sera ver un ejemplo con un esquema. Supongamos que declaramos una variable "int num1 = 5;" y un puntero de tipo int " int *punt; ". Aunque declaremos el puntero con '*', debemos tener en cuenta que para