[C con Clase] Error raro con dev-c++.

Steven Davidson steven en conclase.net
Jue Mar 8 21:24:06 CET 2007


Hola Dardo,

El pasado 2007-03-08 19:20:20, Dardo escribió:

D> Buenas estoy empezando a aprender c++, pero me salio un error que me dejo desconcertado, estaba haciendo el 4 ejercicio del capito numero 10 del curso de c++, lo que queria hacer es aumentar en 1 un elemento de un array del tipo char:
D> numero[i]=numero[i]+1; pero cuando lo ejecuto en el Dev-C++ me tira un error:
D> Violacion de un acceso a memoria (fallo de segmentacion).
D> Entonces windows me tira un error de acceso a memoria y se cierra mi programa. Ya lo depure, hize lo que tengo a mi alcance, pero lo que me desconcerto es que corri lo mismo en el compilador borland c++ 3.1 para DOS, y el programa funciono correctamente, sin presentar ningun error.

No hay ningún error en la función que has enviado. Es posible que te salte el error en esa asignación, pero no es el originario. Sospecho que el problema está en 'main()' y específicamente en el valor que has pasado como parámetro a 'Incrementa()'. Creo que has usado algún puntero. Quizás has hecho algo así:

int main()
{
  char *cadena;

  cin >> cadena;
  Incrementa( cadena );

  return 0;
}

Esto posiblemente provocaría un error, dependiendo del valor "basura" de 'cadena'. Bajo MS-Windows, el modelo de la memoria es "plano" o mejor dicho continuo. Bajo MS-DOS, la memoria es segmentada en bloques de 64 KB. Esto significa que la "basura" de 'cadena' tiene mayor probabilidad de provocar un error bajo MS-Windows, ya que puede acceder a cualquier área, que bajo MS-DOS, que está ubicada en el boque de 64 KB donde está tu propio programa. Hay otros matices, pero no creo que sea necesario elaborar. El quid de la cuestión es que está mal hacer lo anterior bajo cualquier plataforma.

Si no tienes algo parecido a lo que he ejemplificado anteriormente, entonces necesitamos ver más código para averiguar dónde está el problema. Ahora que lo pienso, existe otra razón basada en que el usuario ha escrito más de 9 caracteres en la cadena. Por ejemplo,

int main()
{
  char cadena[10];
  ...
}

El usuario escribe:
12345678901234567890[ENTER]

Estos caracteres sobrepasarán el límite de 10 caracteres en 'cadena'. Ahora bien, esto debería provocar un error nada más presionar [ENTER], porque seguramente estaríamos sobreescribiendo datos de nuestro programa.


Espero que esto te ayude.

Steven


Más información sobre la lista de distribución Cconclase