2012-07-02 12 views
13

Duplicar posibles:
Segmentation Fault when attempting to print value in CNo se puede asignar valores a la variable y el puntero

Estoy muy nuevo en C, pero no tienen idea de por qué este programa se rompe. El programa compila y ejecuta si elimino las líneas que tienen que ver con i, pero si asigno i, ya no puedo asignar nada al *ptr sin romper el programa.

int main(void) 
{ 
    int i; 
    int *ptr; 

    i = 2; 
    *ptr = 5; 
    printf("%d",*ptr); 
} 
+2

[Este] (http://stackoverflow.com/questions/11278085/segmentation-fault-when- intentando-imprimir-valor-en-c) la pregunta casi idéntica se hizo ayer. – pb2q

+0

El problema es que ha creado un puntero, pero no le ha dado ningún valor al que apuntar. Puede asignarle memoria usando la nueva, o apuntarla a una variable como i. – jlunavtgrad

Respuesta

11

Deja el puntero con valor no inicializado. Por lo tanto, cuando lo desreferencia (*ptr), accede a un lugar arbitrario en la memoria, lo que genera un error de segmentación.

Punto ptr algo asignando a ptr en sí (no *ptr) una dirección de una variable (como &i) o alguna memoria recién asignada (como malloc(sizeof(int))).

+0

Entonces, ¿por qué funciona si simplemente uso 'int * ptr;' '* ptr = 5;'? –

+0

Podría "funcionar" o podría fallar, dependiendo de su plataforma, compilador, configuración ... De cualquier forma, es incorrecto. C es un lenguaje inseguro y no verifica si hay errores de memoria, es posible que pasen desapercibidos en su programa y se activen cuando no se esperan. :) – Kos

+1

Gracias! Nunca he trabajado con un lenguaje de administración de memoria manual, así que esto es nuevo para mí. Sin duda, mucho más para pensar. –

-1

Antes de utilizar un puntero en C, lo que necesita, ya sea para establecer el puntero a un bloque existente de la memoria, es necesario asignar memoria para que, de esta manera.

int *ptr = (int *)malloc(sizeof(int)); 
4

Aquí está la respuesta para C:

int main(void) { 
    int i; 
    int * ptr = (int *)malloc(sizeof(int)); 

    i = 2; 
    *ptr = 5;  
    printfn("%d",*ptr); 
    free(ptr); 
} 

alternativa usted puede para el i * y líneas de asignación ptr usar algo como:

int main(void) { 
    int i; 
    int * ptr; 

    i = 2; 
    ptr = &i;  
    printfn("%d",*ptr); // should print 2 
} 

Nótese también que la libre salió !!!

1

Usted declaró ptr pero no lo hizo señalar a nada. Luego trataste de escribir a lo que apunta. Esto nunca es una buena idea. Trate de hacer punto a ptr i añadiendo la línea

ptr = &i; 

antes de intentar escribir en * ptr

Cuestiones relacionadas