0

関数にポインターを渡し、このポインターに動的メモリを割り当てる必要がある初心者の質問があります。メイン関数でポインターを作成し、メモリを割り当てるはずの特定の関数に渡します。しかし、私はこのエラーを受け取ります:「この関数では、hist_array が初期化されていない可能性があります」

これはプログラムからの関連行です: メインから:

    int* hist_array;
    fillHistogram(first_image,hist_array,max_value+1);  

関数:

    void fillHistogram(int image[M][N], int* hist, int histLen){
    hist=(int*)malloc(sizeof(histLen)*(histLen));

関数の署名を変更することはできません。これは構造化ファイルとして提供されたものです。だから私は何が間違っているのか知りたいです。

そして別の質問。malloc で作成している新しい配列の最初の値をすべて 0 にしたいのですが、最短の方法でそれを行うにはどうすればよいですか?

4

2 に答える 2

2

意図は、呼び出し元のコードが を呼び出す前に割り当てを行うことであると思われますfillHistogram

あなたのソリューションの問題は、histinfillHistogramが渡したポインターのコピーであることです。コピーを変更しても、元はまだ初期化されていません。

そして、あなたはおそらくsizeof(int)*histLen.

于 2013-01-12T00:24:37.777 に答える
0

まず、括弧が抜けていると思いますsizeof。Sizeof は関数であり、そのパラメーターが必要です。そして実行するsizeof(histLen)*(histLen)のは、malloc に sizeof(maxvalue+1), histlen 回「予約」するように指示することです。hist_arrayintへのポインタであるため、整数のベクトルを割り当てることが必要になると思います。これは以下で行われます:

hist=malloc(histlen*sizeof(int)); /*I think it gets more easy to read with the lenght multiplier on the left*/

これは、malloc に histlen 整数用にメモリを「予約」するように指示します。

別のこととして、引数として渡しhist_arrayていて、 の malloc を返すポインターを返さないためhist_array、おそらく関数で、メイン関数の値を変更したいと言う必要があります。これは参照渡しと呼ばれ、関数内でその値を変更するには、変数のコピーではなく、変数の指す値を変更したいと言う必要があります。これは次のようになります。

*hist=malloc(histlen*sizeof(int)); /*The pointed by hist, which hist_array, is equal to malloc etc..*/

お役に立てれば。

于 2013-01-12T04:31:56.397 に答える