Initialisation et déréférencement du pointeur C, qu’est-ce qui ne va pas ici?

Cela devrait être super simple, mais je ne suis pas sûr de savoir pourquoi le compilateur se plaint ici.

#include  #include  int main(int argc, char *argv[]) { int *n = 5; printf ("n: %d", *n); exit(0); } 

Obtenir les plaintes suivantes:

foo.c: dans la fonction ‘main’:
foo.c: 6: warning: l’initialisation crée un pointeur à partir d’un entier sans transt

Je veux juste imprimer la valeur que le pointeur n référence. Je le déréférence dans l’instruction printf () et j’obtiens une erreur de segmentation. Comstackr ceci avec gcc -o foo foo.c.

Vous définissez le pointeur sur l’adresse mémoire 5 , afin qu’il pointe vers l’adresse 5 . Vous vouliez probablement faire pointer une adresse où la valeur 5 est stockée. Par exemple:

 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 

vous définissez n pour être l’adresse de mémoire virtuelle 5, car cette mémoire n’est pas valide pour votre application, vous aurez un crash.

Ce que vous devez faire, c’est d’abord obtenir de la mémoire valide. Vous avez deux options: utiliser la stack ou utiliser le tas.

si vous faites quelque chose comme ci-dessous, vous «pointerez sur une variable de stack, où vous pourrez ensuite affecter la valeur 5

 int stackVar = 0; int *n = &stackVar; *n = 5; 

la différence entre stack et tas correspond à l’origine de la mémoire: les variables de stack ne durent que pendant la durée de l’appel de la fonction. lorsque la fonction retourne, les variables de la stack sont “sautées” et ces pièces de mémoire ne sont plus valides. – donc de mon exemple ci-dessus, vous ne pouvez utiliser ‘n’ que tant que ‘stackVar’ est présent, dans ce cas jusqu’au point où vous revenez de votre fonction.

si vous deviez mettre

 int *n = (int *)malloc(sizeof(int)); *n = 5; 

vous allez créer une variable ‘heap’ de taille large (octets). cette variable durera jusqu’à ce que vous appeliez ‘free’

 free(n); 

Gardez à l’esprit que cette opération est quelque peu lourde car une mémoire supplémentaire est créée lors de l’appel à “nouveau”. ce ne sera pas beaucoup, mais ce sera là. Habituellement, vous allouez des classes / structures plus importantes à partir du tas. L’un des fardeaux supplémentaires de l’utilisation du tas est que vous devez vous rappeler d’effacer, sinon vous ferez des «fuites». Je suis sûr que vous avez déjà vu cela 🙂 plus vous utilisez l’application, plus elle utilise de mémoire.

Est-ce que ça a du sens? 🙂

Parce que vous définissez la valeur d’un pointeur sur ‘5’ (comme dans l’adresse de mémoire 5).

Vous avez probablement voulu dire:

int * n = new int (5);

 int *n = malloc(sizeof(int)); *n = 5; 

malloc() renvoie une adresse mémoire, sur laquelle vous souhaitez définir votre pointeur.

Vous devez définir le pointeur sur l’adresse d’une valeur …

 #include  #include  int main(int argc, char *argv[]) { int value = 5; int *n = &value; printf ("n: %d", *n); exit(0); }