C puntatore inizializzazione e dereferenziazione, cosa c'è di sbagliato qui? [duplicare]
-
26-09-2019 - |
Domanda
Questa domanda ha già una risposta qui:
Questo dovrebbe essere super semplice, ma non sono sicuro perché il compilatore si lamenta qui.
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int *n = 5;
printf ("n: %d", *n);
exit(0);
}
Come le seguenti censure:
foo.c: In funzione ‘main’:
foo.c: 6: Attenzione: l'inizializzazione rende puntatore da intero senza un cast
Voglio solo stampare il valore che il puntatore n riferimenti. Sto dereferencing nel printf () ed ottengo un segmentation fault. Compilare questo con gcc -o pippo foo.c.
Soluzione
Si imposta il puntatore indirizzo di memoria 5
, in modo che punti a qualsiasi all'indirizzo 5
potrebbe essere. Probabilmente voleva farlo puntare ad un indirizzo in cui è memorizzato il valore di 5
. Ad esempio:
int v = 5; // Store the value 5 in a normal variable
int *n = &v; // Make n contain the address of v, so that it points to the
// contents of v
Altri suggerimenti
si sta impostando n per essere l'indirizzo di memoria virtuale 5, perché questa memoria è neanche valido per la vostra applicazione si otterrà un incidente.
Quello che dovete fare è ottenere qualche memoria valida prima, hai due opzioni -. Usa la pila, o utilizzare il cumulo
se si fa qualcosa di simile al di sotto avrete 'punto' n ad una variabile di stack, in cui è possibile assegnare il valore 5
int stackVar = 0;
int *n = &stackVar;
*n = 5;
la differenza tra stack e heap è dove la memoria viene da - variabili di stack solo dal vivo per la vita della chiamata di funzione. quando la funzione restituisce le variabili di stack sono "spuntato" e quei pezzi di memoria non sono più validi. -. Quindi, dal mio esempio di cui sopra, si potrebbe usare solamente 'n' per tutto il tempo 'stackVar' è in giro, in questo caso, fino al punto in cui si torna dalla vostra funzione
se si dovesse set
int *n = (int *)malloc(sizeof(int));
*n = 5;
ti verrà creando una variabile 'mucchio' che è sizeof (int) byte di grandi dimensioni. questa variabile durerà fino alla chiamata 'libero'
free(n);
di tenere presente che fare questo è un po 'pesante, come si crea la memoria contabilità in più nella chiamata a 'nuovo'. che non sarà molto, ma ci sarà. Di solito si assegnano le classi più grandi / struct dal mucchio. un onere supplementare di utilizzare l'heap è che hai avuto modo di ricordarsi di cancellare, altrimenti si 'Leak'. Sono sicuro che hai visto questi prima :-) il più a lungo si esegue l'applicazione, la più memoria utilizza
Ha senso? :)
Perché si sta impostando il valore di un puntatore a '5' (come in indirizzi di memoria 5).
Probabilmente voleva dire:
int * n = new int (5);
int *n = malloc(sizeof(int));
*n = 5;
malloc()
restituisce un indirizzo di memoria, che è ciò che si desidera impostare il puntatore a.
È necessario impostare il puntatore l'indirizzo di un valore di ...
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int value = 5;
int *n = &value;
printf ("n: %d", *n);
exit(0);
}