/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

ManejodePunterosyMemoria

 
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
Oscar18457



Registrado: 22 Ago 2007
Mensajes: 13
Ubicación: Chile

MensajePublicado: 09/09/2007 9:53 am
Título: ManejodePunterosyMemoria

Buenas tardes:
He seguido con mis estudios de punteros, y aquí se da el siguiente caso:
Este es un código de un libro Aprenda y Practique C++,(Autor: Kris Jamsa, edición en español) que después de corregirle algunos errores de definición de tipo corre bien en Turbo C++ Lite, (ambiente DOS).
Sin embargo al ejecutarlo en Dev- C++ versión:4992, en modo depuración, indica el siguiente error: warning: Violación de un acceso a memoria (fallo de segmentación) ocurrió en tu programa. Y el depurador queda indicando la línea que produce el error que es justamente *cadena=*cadena - ‘a’ + ‘A’;

Alguien que me enseñe, por favor que es lo que pasa: corre bien bajo compilador de borland y en otros no???





#include <stdio.h>
#include <stdlib.h>

char *cadena_mayusculas(char *cadena)
{
char *direccion_inicial=cadena;
while(*cadena)
{
if ((*cadena >='a') && (*cadena <='z'))
{
*cadena=*cadena - ‘a’ + ‘A’;
printf("%c",*cadena);
}
cadena++;
}
return(direccion_inicial); // direcion es puntero por lo tanto bien aqui

}

int main()
{
cadena_mayusculas("oscar avendano jarry");
return(0);
}
_________________
oa
Volver arriba
tonilope



Registrado: 16 Oct 2005
Mensajes: 249

MensajePublicado: 09/09/2007 10:17 am
Título:

Las cadenas literales (las que van entre comillas y "no están almacenadas" en un array) no se pueden modificar, por eso peta. Prueba así:

Código:

#include <stdio.h>

char *cadena_mayusculas(char *);


int main()
{
   
    char cadena_min[256]="oscar avendano jarry";
   
    cadena_mayusculas(cadena_min);

    printf("%s", cadena_min);
   
    return 0;

}



char *cadena_mayusculas(char *cadena)
{

    char *direccion_inicial=cadena;
   
    while(*cadena)
    {
                 
        if ((*cadena >='a') && (*cadena <='z'))
             *cadena=*cadena - 'a' + 'A';
         
       
        cadena++;
       
    }
   
    return direccion_inicial; // direcion es puntero por lo tanto bien aqui

}


ó así:

Código:

#include <stdio.h>

const char *cadena_mayusculas(const char *);


int main()
{   
   
    cadena_mayusculas("oscar avendano jarry");
   
    return 0;

}



const char *cadena_mayusculas(const char *cadena)
{

    const char *direccion_inicial=cadena;
   
    while(*cadena)
    {
                 
        if ((*cadena >='a') && (*cadena <='z'))
             printf("%c",*cadena - 'a' + 'A');
       
        cadena++;
       
    }
   
    return direccion_inicial; // direcion es puntero por lo tanto bien aqui

}


Salu2 Wink
_________________
Be (void *) my friend


Ultima edición por tonilope el 09/09/2007 10:39 am; editado 2 veces
Volver arriba
cheroky



Registrado: 22 Sep 2005
Mensajes: 1372
Ubicación: En ecx esperando un call

MensajePublicado: 09/09/2007 10:24 am
Título:

Hay un error de concepto en el main, a la funcion que espera un puntero a char le pasas una cadena constante, estas cadenas en C no son modificables.

Si el prototipo de una funciones es const char* el programador sabe que no se modifica en la implementacion de la funcion.

S2.
_________________
- Explícito es mejor que implícito.
- Simple es mejor que complejo.
- Complejo es mejor que complicado.
- Plano es mejor que anidado.
- Ralo es mejor que denso.
Volver arriba
cheroky



Registrado: 22 Sep 2005
Mensajes: 1372
Ubicación: En ecx esperando un call

MensajePublicado: 09/09/2007 10:41 am
Título:

Colision de respuestas grrr.


S2.
_________________
- Explícito es mejor que implícito.
- Simple es mejor que complejo.
- Complejo es mejor que complicado.
- Plano es mejor que anidado.
- Ralo es mejor que denso.
Volver arriba
Oscar18457



Registrado: 22 Ago 2007
Mensajes: 13
Ubicación: Chile

MensajePublicado: 09/09/2007 1:08 pm
Título: ManejodePunterosyMemoria

Gracias a todos por vuestras respuestas. Cada vez el asunto me queda más claro
_________________
oa
Volver arriba
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com