C Affecter le Pointeur à NULL
Je suis malentendu quelque chose de fondamental sur les pointeurs en C, cela devrait être simple, mais la recherche apporte rien. Je ne comprends pas le comportement de la suite de code;
#include <stdlib.h>
#include <stdio.h>
void my_function(char *);
int main(int argc, char *argv[]) {
char *ptr;
ptr = malloc(10);
if(ptr != NULL) printf("FIRST TEST: ptr is not null\n");
else printf("FIRST TEST: ptr is null\n");
my_function(ptr);
if(ptr != NULL) printf("SECOND TEST: ptr is not null\n");
else printf("SECOND TEST: ptr is null\n");
}
void my_function(char *a) {
a = NULL;
}
Sorties;
FIRST TEST: ptr is not null
SECOND TEST: ptr is not null
Pourquoi le deuxième test toujours voir le pointeur de ne pas NULLE? Je suis en train d'utiliser un pointeur NULL affectation comme une sorte de "code de retour" pour indiquer un certain échec de la fonction. Mais lors d'un test le pointeur par la suite, il ne semble pas être NULL.
OriginalL'auteur lynks | 2013-04-30
Vous devez vous connecter pour publier un commentaire.
C'est parce que le pointeur est passé par valeur et non par référence. Si vous souhaitez modifier le pointeur à l'intérieur de la fonction, vous devez passer le réel pointeur un pointeur, c'est à dire un pointeur vers un pointeur:
L'utilisation de l'adresse de l'opérateur
&
lorsque vous appelez la fonction pour obtenir l'adresse du pointeur:OriginalL'auteur Some programmer dude
Votre déclaration
a=NULL
dansmy_function()
en effet définit la valeur dea
àNULL
, maisa
est une variable locale de la fonction.Lorsque vous avez réussiptr
àmy_function()
dansmain()
, la valeur deptr
a été copié àa
.Je suppose que l'ensemble de votre confusion est née de la*
utilisé avanta
dans la définition demy_function()
.Les pointeurs sont généralement transmis à des fonctions lorsque l'on veut manipuler les valeurs d'origine qui ces pointeurs point, à partir de la fonction appelée, et cela se fait par
dereferencing
ces pointeurs à partir de l'fonctions.Dans ce cas, vous avait utilisé ce:il aurait reflété dans la valeur à l'adresse pointée par
ptr
dansmain()
.Mais puisque vous voulez changer la valeur deptr
lui-même, vous devez être en mesure d'avoir un moyen demanipulate
demy_function()
.Pour cela, vous devez utiliser unpointer-to-pointer
,c'est à dire de typechar**
.Vous passez une tellechar**
comme argument pourmy_function(()
et l'utiliser pour modifier la valeur deptr
.Voici la variation de votre code qui permettrait de le faire pour vous:OriginalL'auteur Rüppell's Vulture
en C, un appel de fonction comme
foo(a)
ne changera jamais la valeur de un.OriginalL'auteur richselian
Votre fonction doit prendre un
char** a
si vous souhaitez modifier ce qu'il désigne. C'est parce que les pointeurs sont copié comme arguments à une fonction, ce qui signifie que toutes les modifications que vous apportez à l'intérieur, il ne sera pas vu en dehors de la fonction, comme la modification d'une copie.Si vous voulez le modifier et de le voir en dehors de la portée de la fonction, vous devez ajouter un autre indirection.
OriginalL'auteur Tony The Lion
lors du passage du pointeur à la fonction que le pointeur est copié dans les fonctions de portée. vous avez besoin d'utiliser un pointeur de pointeur si vous voulez faire de telles choses. Un pointeur est essentiellement seulement un entier/long
OriginalL'auteur vszurma
Votre problème, c'est que my_pointer obtient n'est pas d'écrire le pointeur ptr", mais sa copie, "*".
Vous avez besoin de passer l'adresse de "ptr" faites ce que vous voulez.
OriginalL'auteur user2054656