Ver Mensaje Individual
  #31 (permalink)  
Antiguo 15/08/2006, 20:22
Avatar de Instru
Instru
 
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 21 años, 5 meses
Puntos: 52
Problema: Problemas con punteros, direcciones, estructuras, ec
Variante: C/C++
Solucion:

Cuando uno ya conoce los punteros y su utilidad basica, puede que aun caiga en algunos problemas "graves" que podrian incluso inestabilizar a todo el sistema(windows, linux, unix, etc).

1)Problema de los punteros no inicializados.

Es comun este tipo de error en programadores novatos e incluso en programadores de nivel intermedio. Un ejemplo de este error es el siguiente:

int *p;
*p=1;

Para un programador de nivel basico esto resultaria correcto, incluso el compilador lo compila sin problemas. ¿Cual es el error?
Simple, el puntero "p" no esta inicializado, esto quiere decir que p esta apuntando a "cualquier direccion", esta direccion puede contener datos del sistema operativos(en el peor de los casos), datos de algun otro proceso(casos menos peligroso pero igual de graves), datos de tu propio programa(simplemente el programa da efectos secundarios extraños), o datos en la memoria vacia(en el mejor de los casos). Esto obviamente es muy inseguro y compromete la estabilidad el sistema, aparte que este tipo de errores es dificil de identificar en proyectos grandes, ya que el compilador no genera ningun tipo de advertencia.
¿Como solucionar el problema?

Simplemente "apartando" memoria para ese puntero.

En C, la manera tradicional, es usando la funcion de stdlib.h void *malloc(int size);
Esta funcion almacena tantos bytes como size indique y devuelve un puntero a esta memoria apartada. Entonces nuestra correcion quedaria asi:

int *p;
p=(int *)malloc(sizeof(int));
*p=1;

En el caso de c++ se usa el operado new de esta manera:

int *p;
p=new int;
*p=1;

Con esto nos aseguramos que estamos en un area de memoria segura. El operador sizeof se utiliza para obtener el tamaño de alguna estructura o tipo de dato, en este caso es int(en los procesadores de 32 bits int tiene tamaño de 32 bits esto es 4 bytes), por consiguiente

p=(int *)malloc(sizeof(int));

y

p=(int *)malloc(4);

son equivalentes SIEMPRE Y CUANDO el tamaño de int sea de 32 bits.

El operador (int *) es para especificar que el resultado sera un puntero de tipo int y no void como malloc lo marca.

En C++ el operador new facilita aun mas la tarea.

p=new unsigned char[4];

es igual a

p=new int;

ya que unsigned char es lo mismo que un byte.


(Continua)

Última edición por Instru; 11/02/2007 a las 17:58