| Ver tema anterior :: Ver siguiente tema |
| Autor | Mensaje |
|---|
Oscar18457
Registrado: 22 Ago 2007 Mensajes: 13 Ubicación: Chile
| Publicado: 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
| Publicado: 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  _________________ 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
| Publicado: 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
| Publicado: 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
| Publicado: 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 | |
 |
|
|