A la hora de ejecutar el programa me sale "Violacion de segmento"
Aguien sabe porque esta estructura me da el problema de "Violacion de segmento", a la hora de ejecutar el programa.
El programa no es mas que multiplicar un numero por otro pero por el metodo de "a la rusa"
Saludos y gracias
El programa es este:
#include
#include
main(){
/*Declaro las variables que voy a utilizar*/
int n=0,factor1,factor2,resto;
/*Le pido que introduzca los numeros que quiere multiplicar*/
printf("Introduzca el primer numero para multiplicar\n");
scanf("%d", factor1);
printf("Introduzca el segundo numero para multiplicar\n");
scanf("%d", factor2);
/*Introduzco que pasaria si uno de los numero es cero*/
if(factor1==0 || factor2==0){
printf("El resultado es 0");
}
else{
/*Introduzco que pasaria si uno de los numero es uno*/
if(factor1==1 || factor2==1){
if(factor1==1){
printf("El resultado es %d", factor2);
}
else{
printf("El resultado es %d", factor1);
}
}
else{
/*Introduzco una estructura bucle "do", con condicion al final como algoritmo principal del programa*/
do{
resto=factor1%2;
/*Utilizo la condicion de que el resto sea distinto de 0 para que sume los factores*/
if(resto!=0){
n=n+factor2*2;
}
factor1=factor1/2;
factor2=factor2*2;
/*En cuanto factor1 es igual a 1, la estructura es falsa y acaba el bucle*/
}while(factor1!=1);
printf("El resultado es %d\n", n);
}
}
}
- Inicie sesión o regístrese para enviar comentarios
- 1514 lecturas


Cuando pegues codigo, usa las etiquetas de código asi queda mas prolijo.-
Otra cosa, las dos lineas de:
#include#include
Están vacias??
Saludos.-
si jaja no se porque al copiar y al pegar se me han ido, pero ya encontre el error, si te fijas en los scanf no he puesto "&" en ninguno de ellos.
Hola Klapi!
Me llama la atencion que (aunque no se "hayan copiado", como tu nos dices), incluyas dos librerias en tu codigo. Personalmente, acabo de probarlo agregandole los '&' donde correspondian, y solo inclui la libreria stdio, y me funciono a la perfeccion.
¿Cual fue la otra libreria que habias incluido?
Ten en cuenta que el scanf trata una dirección de memoria, a la cual le asignas el valor leído, por eso hay que poner el &, porque este indica que es la dirección de memoria de esa variable...
Lo único que se me ocurre es que no usaras gcc, y que tu compilador pasara por alto que referenciaras la dirección de memoria en los scanf, por lo que al hacer el scanf, el cogiera el valor que hay en las variables factor1 y factor2, y al escribir en ellas, el so se dé cuenta de que está escribiendo en zonas de memoria que no le corresponde y por eso te de un error..., pero vamos, el compilador no te debería dejar compilar sin esas & (a parte de no incluir stdio para usar funciones como printf, scanf, etc...)
P.D.: de todas maneras, el código no es correcto.
pero vamos, el compilador no te debería dejar compilar sin esas & (a parte de no incluir stdio para usar funciones como printf, scanf, etc...)
Lo acabo de probar con el gcc y sí que deja compilar. Dando warnings de que no es un puntero pero acaba la compilación. Lo he probado porque me sonaba que se podía, este fue uno de los primeros fallos que me volví loco para arreglar cuando aprendí c. :P
El compilador lo permite porque al fin y al cabo un puntero es un entero con lo que puede considerar que te has olvidado de un casting. En resumen... la magia del C. xD
pero vamos, el compilador no te debería dejar compilar sin esas & (a parte de no incluir stdio para usar funciones como printf, scanf, etc...)
Lo acabo de probar con el gcc y sí que deja compilar. Dando warnings de que no es un puntero pero acaba la compilación. Lo he probado porque me sonaba que se podía, este fue uno de los primeros fallos que me volví loco para arreglar cuando aprendí c. :P
El compilador lo permite porque al fin y al cabo un puntero es un entero con lo que puede considerar que te has olvidado de un casting. En resumen... la magia del C. xD
Tiene que ver con la forma en que esta definido scanf:
int scanf(const char *formato, ...);
De esta forma se admiten punteros de cualquier tipo, y eso incluye variables que no son precisamente punteros.
en el scanf debes utilizar el '&' + el nombre de la variable, porque scanf espera una dirección de memoria
cuando existe violación de segmento significa que has accedido a un segmento de la memoria a la que no tienes acceso
en el scanf debes utilizar el '&' + el nombre de la variable, porque scanf espera una dirección de memoria
cuando existe violación de segmento significa que has accedido a un segmento de la memoria a la que no tienes acceso
Así es, puesto que scanf escribe el resultado en la dirección indicada en el segundo argumento, al poner la variable sin & se pasa el valor de la variable como dirección y ahí ocurre la violación de segmento.