2013-04-30 16 views
9

私はCのポインタについて何か基本的なことを誤解していますが、これは簡単なはずですが検索で何も表示されません。私は次のコードの動作を理解していません。CポインタをNULLに代入する

#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; 
} 

出力します。

FIRST TEST: ptr is not null 
SECOND TEST: ptr is not null 

なぜ2番目のテストでもポインタがNULLではないと表示されるのはなぜですか?私は関数の特定の失敗を示すための一種の 'return flag'としてNULLポインタ割り当てを使用しようとしています。しかし、後でポインタをテストすると、NULLには見えません。

答えて

25

ポインタは値渡しであり、参照渡しではないためです。あなたが関数内のポインタを変更したい場合は、ポインタとして、実際のポインタを渡す必要がある、すなわちポインタへのポインタ:

void my_function(char **a) 
{ 
    *a = NULL; 
} 

あなたが取得する関数を呼び出す際にアドレス演算子&を使用しますポインタのアドレスは:あなたは、それが指すものを変更したい場合は

my_function(&ptr); 
+0

あなたが答えた直前であったのは私が突然私を殴ったのです。私は外側のポインタを割り当てることができるようにポインタへのポインタが必要です! – lynks

1

あなたの機能はchar** aを取る必要があります。これは、ポインタがで、関数への引数としてがコピーされているためです。つまり、内部で行った変更はコピーの変更として関数外には見えません。

変更して機能スコープの外側に表示する場合は、別の間接参照を追加する必要があります。

0

ポインタを関数に渡すと、ポインタが関数スコープにコピーされます。そのようなことをしたい場合はポインタのポインタを使う必要があります。ポインタは基本的に整数/長さだけです

1

Cでは、foo(a)のような関数呼び出しは決してaの値を変更しません。

0

あなたの問題は、my_pointer getsがポインタ "ptr"に書き出さず、そのコピー "* a"です。

"ptr"のアドレスをあなたが望むものに渡す必要があります。

5

あなたの声明my_function()a=NULLが実際にNULLaの値を設定しますが、aはあなたがmain()my_function()からptrを通過したことfunction.Whenのローカル変数である、ptrの値は、あなたの全体を考える.I aにコピーされました混乱は、aの前に使用された*から、my_function()の定義から生じた。

ポインターは、呼び出された関数からポインターが指し示す元の値を操作するときに関数に渡されます。これは呼び出された関数のポインターdereferencingによって行われます。この場合、 :

*a= blah blah; 

アドレスは、あなたがptr自体の値を変更したいので、.But、あなたからmanipulateにそれをする方法を持ってできるようにする必要がありmain()ptrの指すでそれが値に反映しているでしょうmy_function()。あなたがpointer-to-pointerを使用し、このために、すなわちタイプchar**の。あなたはmy_function(()に引数として、このようなchar**を渡すとptr .Hereのあなたのためにそれを行うだろう、あなたのコードに変化の値を変更するためにそれを使用します。

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

void my_function(char **); // Change char* to 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); //You pass a char** 

    if(ptr != NULL) printf("SECOND TEST: ptr is not null\n"); 
    else printf("SECOND TEST: ptr is null\n"); 
} 

void my_function(char **a) { //Change char* to char** here 
    *a = NULL; 
} 
関連する問題