0

次のような小さなコードがあります。

 #include <stdio.h>

    int *ptr1;
    int *ptr2;


  void some_function(void)
    {

    int B = 5;
    ptr2 = &B;
    }

  main (){
    int C, D;
    int A =10;
    int *ptr3;
    ptr1= &A;

    ptr3=ptr2;

    some_function();

    C = *ptr1 + *ptr2;

    printf("Sum of the numbers C= %d\n",C);

    some_function();
    D = *ptr1 + *ptr3;

    printf("Sum of the numbers D= %d\n",D);

  }

D の結果が得られないのに、C の結果が得られるのはなぜですか? print ステートメント S の結果は得られますが、um of the numbers C=15D の最後の print ステートメントの結果は得られません。ローカル ポインターとグローバル ポインターの違いは何ですか (ptr1 と ptr2 の両方がグローバルに定義され、ptr3 がローカルに定義されていることを意味します)。ポインタの割り当てはptr3=ptr2有効ですか? ローカル変数 Vs へのポインターとの大きな違いはありますか。グローバル変数へのポインタ?

4

2 に答える 2

7
ptr3 = ptr2;

ptr3ptr2の値は。で初期化されますNULL。これはNULL、初期化しておらず、静的な保存期間があるためです。

その後、あなたはします

D = *ptr1 + *ptr3;

ptr3nullポインタである間接参照です。これは未定義の動作です。の値はptr2プログラム中に変更された可能性がありますが、ptr3それでもnullポインターです。

編集:完全を期すために(まあ、ある種):

void some_function(void)
{
    int B = 5;
    ptr2 = &B;
}

B関数が終了すると、オブジェクトの有効期間は終了しsome_functionます。帰国後はアクセスできませBん。その意味は:ptr2some_function

C = *ptr1 + *ptr2;

ptr2また、このステートメントで無効なポインターである間接参照を行っているため、未定義の動作が呼び出されます。

于 2012-12-31T17:43:00.723 に答える
2

ptr3=ptr2; 関数の呼び出しの前に対処した ため、ptr2が0(デフォルトではグローバル変数の値)であるため、それに some_function();割り当てられた間違ったアドレスはNULLになります。ptr3

このようにしてください:

some_function();
ptr3=ptr2;
D = *ptr1 + *ptr3;
printf("Sum of the numbers D= %d\n",D);  

ptr2また、関数の呼び出し後に値が使用されるため、次のコードは正しく実行されsome_function();ます。

some_function();
C = *ptr1 + *ptr2;
printf("Sum of the numbers C= %d\n",C)  

Ooh !、変数のスコープはptr2some_function()のローカルを指します。

void some_function(void)
    {

    int B = 5;
    ptr2 = &B;
    }

このようにしてください:

void some_function(void)
    {

    int* B = calloc(1,sizeof(int));
    *B = 5; 
    ptr2 = B;
    }  

free(ptr2)また、ステートメントを印刷した後も忘れないでください。

于 2012-12-31T17:42:08.107 に答える