2011-01-31 15 views
1

注:CはMicrosoft Cコンパイラです。callocを使用した後のCアクセス違反

私は、次のコードに問題を抱えています。

*Roomsize = (int*)calloc(sizeof(int),sched->numberOfRooms); 

roomIndex = 0; 
for(roomIndex=0; roomIndex< sched->numberOfRooms; roomIndex++) 
{ 
    fscanf(inputFile,"%d",&lineInput); 
    numberOfLinesRead++; 
    *Roomsize[roomIndex] = lineInput; 
} 

これは別のCファイルです。私はこれらの問題を抱えていないので、保守性を高めるために物を分けることにしました。私はちょっとした指針を混ぜてしまっていると思います。

のcallocが正常に動作します。ループの最初の反復で

は、roomIndexの要素ゼロが正しく設定されます。

ただしループの2番目の要素(要素1)は、常に実行時にアクセス違反が生じます。

私は2次元配列で、あまりにも、後で私のコードでは、この問題に遭遇し、私はそれがまったく同じ問題です考え出すことだし、これだけの最も単純なケースです。

ここに最初の要素以外は何も設定できないように見えるのは誰にでも分かりますか?

答えて

5

*Roomsize[roomIndex]*(Roomsize[roomIndex])と同じです。あなたは(*Roomsize)[roomIndex]と言っています。

(私はRoomsizeが実際にint**であると仮定しています。それは正しくないなら、問題は別の場所にあるのかもしれない。)

+0

それがうまくいった!括弧は実際に何を意味していますか? – RekrowYnapmoc

+0

あなたの前提は正しいです。 – RekrowYnapmoc

+0

括弧は、通常の配列アクセス演算子です。操作の順序に従って、配列アクセスはポインタ参照解除の前に行われます。 –

0

あなたの最初の行を、あなたはRoomsizeを割り当てる際に、間違ったに見えます。 Roomsizeがint *であると仮定して正しいとすれば、Roomsize = (int *) calloc...と言ってください。@Danielが投稿したときに、アスタリスクも取り除くように割り当てを変更する必要があります。

+0

いいえ、それは私が考える方法です。 (そうでなければ、私はそれがコンパイラを越えないと仮定している)。 DanielはRoomsizeがint **であるという前提で正しいです。これは、ファイルの外側でint *として宣言され、ポインタを介して渡されます。私はそれを書くつもりです。したがって、最初に逆参照しています。しかし、助けてくれてありがとう。 – RekrowYnapmoc

関連する問題