C puntatore inizializzazione e dereferenziazione, cosa c'è di sbagliato qui? [duplicare]

StackOverflow https://stackoverflow.com/questions/3019355

  •  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.

È stato utile?

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);
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top