2011-03-26 11 views
6
#include<stdio.h> 

int main() 
{ 
    int *ip; 
    printf("Enter a no \n"); 
    scanf("%d",ip); 
    printf("ip=%d",*ip); 
} 

Por encima es mi programa y cuando lo ejecuto siguiente es resultado demodo de transmitir el valor a un puntero entero

./a.out 
Enter a no 
10 
Segmentation fault 

me registré línea de GDB 6 es un problema que es

scanf("%d",ip);

Debo inferir que ip es un puntero a entero y %d espera un valor de dirección. Mientras trato de pasar un número entero al valor especificado por ip, entonces creo que es incorrecto. Pero, ¿qué es lo correcto para hacer en la situación anterior? Quiero usar escanear y asignar un valor entero a la dirección apuntada por ip (que en mi caso falta).

Respuesta

5

La solución de David Heffernan es cierta.Sin embargo, si desea utilizar un puntero (para saber cómo funciona un puntero), debe asignar manualmente la variable con "malloc".

#include <stdio.h> 
#include <stdlib.h> /* for malloc and free */ 

int main (void) 
{ 
    int *ip = malloc(sizeof(int)); /* declare and allocate a new int pointer */ 
    printf("Enter a no \n"); 
    scanf("%d", ip); 
    printf("ip = %d", *ip); 

    free(ip); /* free the memory */ 

    return 0; 
} 

malloc() y libre() se encuentra en stdlib.h. Cuando declaras:

int *ip; 

Acabas de asignar un puntero que apunta a "nada". Por lo tanto, debe asignar la memoria necesaria con malloc(). Después de eso, * ip apunta a su nuevo lugar de memoria e ip es la dirección del nuevo lugar de memoria.

Debe liberar la memoria manualmente cuando ya no necesite la variable con free().

+0

sí lo entendiste bien, trato de entender cómo funciona el puntero. –

1

Debe asignar memoria a ese puntero.

int *ip = malloc(sizeof(int)); 
// do stuff with ip 

free(ip); //free the memory allocated 

Más: http://cslibrary.stanford.edu/102/PointersAndMemory.pdf

+0

@N 1.1 que es un excelente enlace gracias por publicar aquí el enlace. –

+0

@registrado: bienvenido –

5

No ha asignado ningún almacenamiento, solamente un puntero. El puntero necesita algo para señalar. Usted debe hacerlo de esta manera:

#include <stdio.h> 
int main(void) 
{ 
    int i; 

    printf("Enter a no \n"); 
    scanf("%d", &i); 
    printf("i=%d", i); 
    return 0; 
} 

También he tomado la libertad de hacer la declaración de main() válida, y devolver un valor.

Si usted quiere aprender acerca de los punteros, y luego tratar de esta manera:

#include <stdio.h> 
int main(void) 
{ 
    int i; 
    int* ip; 

    ip = &i; 
    printf("Enter a no \n"); 
    scanf("%d", ip); 
    printf("*ip=%d", *ip); 
    return 0; 
} 

O si desea asignación del montón en lugar de asignación de pila:

#include <stdio.h> 
#include <stdlib.h> 
int main(void) 
{ 
    int* ip; 

    ip = malloc(sizeof(int)); 
    printf("Enter a no \n"); 
    scanf("%d", ip); 
    printf("*ip=%d", *ip); 
    free(ip); 
    return 0; 
} 
+0

Hefferman no no, no estoy tratando de probarlo de la manera en que lo mencionaste. Solo estoy tratando de entender cómo puedo almacenar algo cuando declaro algo como un puntero, este es solo un pequeño programa que soy tratando de hacer ejercicio –

1

debe asignar memoria.

int* ip = malloc(sizeof(int)); 
scanf("%d", ip); 
... 
free(ip) 

O, simplemente, pasar la dirección de una pila variable de

int i; 
scanf(%d, &i); 
1

No, estás equivocado, ip no es un puntero entero. El tipo de ip es un puntero entero, es decir, lo que asigna a ip debe ser un puntero entero. Pero no asignaste nada a ip. Entonces, ¿dónde espera que el scanf almacene el valor entero?

2

Ésta es una forma de solucionarlo:

#include<stdio.h> 
int main() { 
    int i; 
    printf("Enter a no \n"); 
    scanf("%d", &i); 
    printf("i=%d", i); 
} 

Y Otra forma es:

#include<stdio.h> 
int main() { 
    int* ip = malloc(sizeof int); 
    printf("Enter a no \n"); 
    scanf("%d", ip); 
    printf("ip=%d", *ip); 
} 

El problema con el original es que int* ip; se acaba declarando un puntero a un entero, pero no asignar cualquier memoria para contener el entero real, o configurar el puntero para señalar algo significativo. Acaba de obtener un puntero a una ubicación de memoria aleatoria que puede o no ser direccionable por su programa. Por lo tanto, obtiene un error de segmentación cuando scanf() intenta desreferenciar este puntero para escribir datos en él.

Cuestiones relacionadas