2012-06-30 20 views
6

El siguiente código C devuelve un error de "falla de segmentación". No entiendo por qué no devuelve el valor 20. ¿Cuál es mi error?Error de segmentación al intentar imprimir el valor en C

#include <stdio.h> 

int main() 
{ 
    int* n; 
    *n = 20; 

    printf("%i\n",*n); 

    return 0; 

} 
+0

'n' es un valor de puntero no inicializado que está en la línea de eliminación de referencias '* n = 20 '. Si desea utilizar un puntero, debe asegurarse de inicializarlo para apuntar a una ubicación de memoria válida antes de intentar desreferenciarlo. – reuben

+0

Alternativamente a las respuestas ya dadas, puede simplemente 'int n = 20' y pasar' & n' (la dirección de n), a cualquier función que necesite 'int *' como parámetro. – Vassilis

Respuesta

14

No ha asignado memoria para n, por lo

*n = 20; 

intentos de escribir la memoria no especificado.

Trate

#include <stdlib.h> 

int *n = malloc(sizeof *n); 
/* use n */ 
free(n); 
+1

¡No olvide liberar n cuando haya terminado! –

+0

Buen punto, eso. –

4

No ha asignado espacio para su int, sólo se ha declarado un punteroa un int.

El puntero no está inicializado, por lo que escribir en ese espacio desconocido en la memoria es un comportamiento indefinido y causa problemas. Esto generalmente causa una segfault.

Puede asignar una ranura para un entero usando malloc:

n = malloc(sizeof(int)); 

Y el uso de una llamada correspondiente a free para liberar la memoria más adelante:

free(n); 

Pero la asignación de una sola ranura para una El número entero es bastante inusual, normalmente asignaría int en la pila:

int n; 
n = 20; 
1

Usted está tratando de escribir 20 en el valor de la basura. Debe asignar espacio para ello utilizando una de las funciones *alloc() o creando una int en la pila y obteniendo el formato (como Richard J. Ross III mencionado en los comentarios).

asignación dinámica:

int n*; 
n = malloc(sizeof(int)); /* allocate space for an int */ 
if(n != NULL) { 
/* do something.. */ 
free(n); /* free 'n' */ 
} else { 
    /*No space available. */ 
} 

o en la pila :

int int_on_stack; 
int *n = &int_on_stack; 
*n = 20; 
printf("%i\n", *n); // 20 
+1

Tenga en cuenta que 'malloc' no es la única solución. Hay 'mmap',' alloca', y simplemente crea un int en la pila y obtiene su dirección. –

+0

@ RichardJ.RossIII: Gracias. Actualizado. – Jack

+0

Su ejemplo de pila no es consistente con "obtener el apoyo". Lo que quieres es 'int onstack; int n = & onstack; * n = 20; printf ("% i \ n", * n); '... Oye, tengo privilegios de edición, así que seguí adelante e hice el cambio. –

Cuestiones relacionadas