ルーチンのC言語のデータ構造

取り扱いCSDN自己https://blog.csdn.net/u013213111/article/details/93784522

さまざまなデータ構造は、おそらく日常的にまとめ、コードを書くためのCでDSAAに従っ:

最初は定義です:

typedef struct XXXXX
{
    //数据结构包含的元素
} XXX

そして、領域を割り当てるmalloc(sizeof(XXX))
データ要素を格納するために使用される配列、だけでなく、キューとして配列に割り当てられた余分なスペースのために:
Q->array = malloc(sizeof(int) * max);
最後まで使用することは自由に覚えておく必要があります!

このルーチンは広く、そのようなあなたがデータ構造として欲しい画像として、使用されているので、すべての最初に定義します:

typedef struct ImgStruct
{
    uint8_t *data;
    int width;
    int height;
} Image;

その後、画像をインポート(OpenCVのとここに、C ++は、Cと呼ばれることができ、パッケージング機能を見る必要があります):

Image *image_import(char *img_name)
{
    Image *img;
    img = (Image *)malloc(sizeof(Image));
    cv::Mat img_mat = cv::imread(img_name, cv::IMREAD_GRAYSCALE);
    img->width = img_mat.cols;
    img->height = img_mat.rows;
    int img_size = img_mat.cols * img_mat.rows;
    img->data = (uint8_t *)malloc(img_size);
    //cv::imshow("image", img);
    for (int i = 0; i < img_mat.rows; i++)
    {
        for (int j = 0; j < img_mat.cols; j++)
        {
            img->data[i * img_mat.rows + j] = img_mat.at<uchar>(i, j);
        }
    }
    return img;
}

したがって、唯一の主な機能のいずれか:

    Image *src;
    src = image_import("demo.bmp");

最後に自由、NULLはダングリングポインタを防止するために設定されています。

void image_free(Image *img)
{
    free(img->data);
    img->data = NULL;
    free(img);
    img = NULL;
}

ダングリングポインタの問題を強調し、基準ダングリングポインタ(ダングリングポインタ)メソッドを回避します

ダングリングポインタとは何ですか?
メモリのポインタが解放され、ポインタが空いています。
ポインタの害をダングリング?
アクセスダングリングポインタ、ランダムの結果。プログラムが正常に機能しない原因となることがあり、それはプログラムがクラッシュする可能性があります。他の機能が影響を受けている場合は、問題が頻繁に見つけることが困難です。
ダングリングポインタを避けるためにどのように?
基本的な考え方:解放されたメモリは、ポインタ変数がNULLに設定され、このメモリを指します。訪問ポインタ変数の前に、最初のNULLにするかどうかを判断します。
高度:複数のポインタ変数は、同じ時間にメモリを指すがある場合、このメモリは解放され、ポインタ変数の必要なすべての値がNULLに設定されている、それはこのメモリポインタ変数のすべてについての情報を維持する必要性を指すが、これを大きな支出の方法は、彼らは通常、ほとんど使用されていません。などのオブジェクトの使用頻度が非常に高いではありません、あなたはIDに基づいてインデックスを見つけることができ、使用する前に、そうでない場合には、使用しないでください。ユーザーがある場合は、我々はそうでない場合は、単に参照カウントがデクリメントされ、実際にメモリを解放し、参照カウントが0である場合にのみ、参照カウントを使用することができ、このメモリを解放することはできません。

ところで、複数のデータ構造DSAAの様々な機能はもちろん、値によって渡されるパラメータとして、ポインタが渡され、差が参照することができる値でC言語の構造体と、分析を渡します

パラメータとしてオブジェクトの構造は、コンパイラは(私たちは、着信アドレスによって異なるとの主な見つけることができます)、コピーすること。この場合、操作はコピー操作の関数である、原点値主な機能には影響を与えません。欠点は、構造体変数が非常に大きい場合、コンパイラは、大きなオーバーヘッドをコピーする、ということです。パラメータとして、アドレスの構成、及び主機能操作サブルーチンの動作は同じ構造である場合、この時間は、パラメータアドレスを渡します。利点は何のコピーではありませんが、使用しているときに、その値、修正を必要とconstキーワードを変更したくない場合は、注意してください。

おすすめ

転載: www.cnblogs.com/lyrich/p/11110596.html