2012-01-10 6 views
0

simplement jouer avec des pointeurs, en essayant de passer l'adresse d'un pointeur vers une fonctionC pointeur vers pointeur via la fonction

utilisant:

void changer(int **ptr) 
{ 
    if(**ptr==NULL) 
    { 
     *ptr=(int *)malloc(sizeof(int)); 
     **ptr=2; 
    } 

} 

int main() 
{ 
    int *ptr; 
    clrscr(); 
    changer(&ptr); 
    printf("%d",*ptr); 
    getch(); 
    return 0; 
} 

dur le programme est conforme, les résultats ne sont pas comme prévu! !

+2

** les résultats ne sont pas comme prévu !! ** Qu'attendiez-vous? S'il vous plaît fournir plus d'informations – Krishnabhadra

+1

Quel est le comportement prévu? Que fait-il réellement? Il y a plusieurs bugs dans votre code, mais sans savoir ce que vous vouliez faire, je ne sais pas comment vous aider. – templatetypedef

+0

Dans le monde, quelle est la fonction 'clrscr()'? Et quels résultats obtenez-vous? Comment cela se compare-t-il aux résultats que vous attendiez? –

Répondre

4

Vous avez une déréférence supplémentaire de ptr dans la vérification NULL et vous n'initialisez pas le pointeur. Le programme devrait ressembler à ceci après le correctif:

#include <stdio.h> 
#include <stdlib.h> 

void changer(int **ptr) 
{ 
    if(*ptr==NULL) // Dereference once, not twice 
    { 
     *ptr=(int *)malloc(sizeof(int)); 
     **ptr=2; 
    } 
} 

int main() 
{ 
    int *ptr = 0; // Initialize the pointer 
    clrscr(); 
    changer(&ptr); 
    printf("%d",*ptr); 
    getch(); 
    return 0; 
} 
+1

allez-y, merci pour votre aide – Akash

3

Il tombe en panne parce que vous vouliez dire sur la ligne 3:

if (*ptr == NULL) 

plutôt que

if (**ptr == NULL) 

Vous aussi voulez initialiser le pointeur vers NULL sur la ligne 13, puisque vous Analysant que, ci-dessus:

int *ptr = NULL; 

En C, les variables ne sont pas automatiquement initialisées d à zéro, à moins d'être alloués à la portée statique, ce qui a d'autres conséquences selon le contexte.

2

Vous n'êtes pas initialisé ptr dans main(), mais vous vérifier si ce qu'il pointe est zéro dans changer().

Utilisation:

#include <stdio.h> 
#include <stdlib.h> 

void changer(int **ptr) 
{ 
    if (*ptr == NULL) 
    { 
     *ptr = (int *)malloc(sizeof(int)); 
     if (*ptr != NULL) 
      **ptr = 2; 
    } 
} 

int main(void) 
{ 
    int *ptr = NULL; 
    changer(&ptr); 
    printf("%d\n", *ptr); 
    return 0; 
} 
0

Comme autre dit, vous avez un supplément *.

Je pense que vous pouvez utiliser le fait, que les déclarations var en c sont faites à partir d'un type, et une expression.

Par exemple, le déclare int **ptr (si votre fonction), dire que l'expression **ptr est du type int, donc dans le contrôle **ptr == NULL, vous comparez à un pointeur int. C'est légal, mais quand vous vous trouvez en train de faire quelque chose comme ça, vous voudrez peut-être repenser à ce que vous faites. (et un bon compilateur peut vous donner un avertissement)