Cのワイルドポインタとは何ですか?どうすれば回避できますか?

C のワイルド ポインターとは?

初期化されていないポインターは、ワイルド ポインターと呼ばれます。初期化されていないポインタの動作は、任意のメモリ位置を指しているため未定義です。ワイルド ポインターは、プログラムをクラッシュさせたり、不適切な動作をさせたりする可能性があります。

注: 通常、コンパイラはワイルド ポインターについて警告します。

int *ptr; //ptr is wild pointer

ワイルド ポインターを理解するプログラムを見てみましょう。

#include<stdio.h>

int main()
{
    //ptr pointing some unknown memory location
    int *ptr; /* wild pointer */

    //Assigning value
    *ptr = 12;

    printf("%d\n",*ptr);

    return 0;
}

出力:

未定義の動作。

説明: 上記のプログラムでは、ptr は有効なメモリによって初期化されていません。そのため、未知の場所にアクセスすると、未知の場所を指している可能性があり、プログラムの動作は未定義になります。

どうすればワイルド ポインターを回避できますか?

プログラムでのワイルド ポインターの作成は簡単に回避できます。ポインター宣言時に、有効なメモリでポインターを初期化する必要があります。 C プログラムの例を見てみましょう。

#include<stdio.h>

int main()
{
    int data = 27;

    //Now pointer pointing valid memory
    int *ptr = &data; /* no more wild pointer */

    //Assigning value
    *ptr = 12;

    printf("%d\n",*ptr);

    return 0;
}

出力:

12

説明: ptr はデータを指しているため、ptr はワイルド ポインターではありません。

変数がない場合は、メモリ管理関数 (malloc、calloc など) を使用して有効なメモリを割り当てることができます。例を見てみましょう。

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

int main()
{
    //Now pointer pointing valid memory
    int *ptr = malloc(sizeof(int)); /* no more wild pointer */

    if(ptr == NULL)
    {
        return -1;
    }
    //Assigning value
    *ptr = 12;

    printf("%d\n",*ptr);

    free(ptr); //free allocated memory

    return 0;
}

出力;

12

最後に、宣言時にポインタにメモリを割り当てたくない場合。ポインターは NULL (ヌル ポインター) で初期化する必要があります。 null ポインターの動作は C 標準で定義されており、使用する前にポインターを検証する必要があります。

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

int main()
{

    int *ptr = NULL; /* no more wild pointer */

    if(ptr == NULL)
    {
        ptr = malloc(sizeof(int));
        if(ptr == NULL)
        {
            return -1;
        }
        //Assigning value
        *ptr = 26;

        printf("%d\n",*ptr);

        free(ptr); //free allocated memory
    }

    return 0;
}

出力;

26

おすすめの記事:

  • ダングリング、ボイド、ヌル、およびワイルド ポインター
  • C/C++ でのポインター インタビューの質問
  • c の関数ポインタ、詳細なガイド
  • C で動的配列を作成する方法
  • メモリ割り当てに関する 15 のよくある間違い
  • C で 2 次元配列にアクセスするには?
  • C でのポインタの簡単な説明
  • C 言語で関数ポインタの構造を使用する方法
  • 100 C の面接の質問。面接官が尋ねる可能性があります。
  • C のメモリ レイアウト
  • Python 面接の質問と回答
  • C でのファイル処理
  • 構造体の関数ポインタ
  • C の void ポインター、詳細な説明
  • C でのファイル処理
  • C フォーマット指定子。