2011-11-10 6 views
1

私はサードパーティのライブラリ(ソースコードは提供されていません)を利用するプログラムを持っています。 DP_AcquireFingerprint()という関数があるとします。この関数呼び出しは、指紋スキャナハードウェアから指紋画像を読み取るためにサードパーティのライブラリとインターフェイスします。C:深い関数呼び出しは特有の動作を引き起こしますか?

私はmain()から直接この関数を呼び出すと、それが正常に動作します:

int main(int argc, char** argv) { 
    Matrix* mat; 
    DP_AcquireFingerprint(&mat); /* Works fine */ 
} 

ただし、この機能は深い関数呼び出しに埋もれたときに奇妙な演技を開始します。例:

void func1(Matrix** mat) { 
    DP_AcquireFingerprint(mat); 
} 

void func2(Matrix** mat) { 
    func1(mat); 
} 

void func3(Matrix** mat) { 
    func2(mat); 
} 

void func4(Matrix** mat) { 
    func3(mat); 
} 

int main(int argc, char** argv) { 
    Matrix* mat; 
    func4(&mat); /* Not working! */ 
} 

特に、ライブラリは、私は(この関数内)指紋画像を格納するために、ヒープに十分なメモリが割り当てられていることをかなり確信しているのに対し、バッファ十分な誤りがあることを訴えました。

質問は、最初のコードスニペットと2番目のコードスニペットの違いは何ですか?別の場所で呼び出された場合、関数が異なる動作をする可能性はありますか?

+0

元の 'mat'ポインタは、この関数に渡す前に初期化するのか、それともその目的ですか? –

+0

初期化は関数内で行われます。 – Andree

答えて

2

バッファの割り当てが正しくない場合は、コードの再編成によって動作が変わる可能性があります。バッファオーバーランは未定義の動作であるため、このような再編成では異なる可能性があります。私はあなたが質問に存在していないバッファ割り当てコードをもう一度見なければならないと思います。

0

ソースコードをコンパイルするときにデバッガ情報を有効にした後でプログラムをデバッグしようとしましたか(つまり、gcc -g -Wallをコンパイルしてリンクし、次にgdbを使用します)。

関連する問題