私は学校向けのプロジェクトに取り組んでおり、コードで本当に不格好なことをすることで回避策を見つけることができました。複数のフィールドを保持する構造体があり、次のフィールドにアクセスしようとしています(current_eventという名前の構造体で宣言されているため)。
int *number_of_couples;
その後、プログラムにこの値を呼び出して、この*number_of_couplesフィールドに基づいて配列を動的に割り当てることができるようにします。Cには(良い)解がないので、基本的にこれを「長さ」演算子として使用しようとしています。
次のコードを実装しようとする前に:
int *permutable_array;
permutable_array = malloc((current_event->number_of_couples) * sizeof(int)); //Line 91
if(permutable_array == NULL){
panic("permutable_array"); //Ensures that Malloc was successful.
}
これにより、次のエラーがスローされます。行91:エラー:バイナリへの無効なオペランド*('int*'および'unsigned int'があります)
この時点で私はプログラムを機能させたいだけなので、私は非常にずさんな回避策を講じました(純粋なプログラミングの3時間目!ロックオン!)。だから私は実装しました:
int *permutable_array;
int avoid_my_bug = (int) current_event->number_of_couples;
permutable_array = malloc(avoid_my_bug * sizeof(int));
if(permutable_array == NULL){
panic("permutable_array");
}
どちらが機能しますか。今、私はそれが私に言っているエラーをいくらか理解しています。number_of_couplesの値を、ポインターでもあるcurrent_event内のポインターとして格納したという事実と関係があるのではないかと思います。したがって、実際には、number_of_couplesの値が4の場合、プログラムがその値に到達するために作成するパスは次のとおりです。
ptr_to_current_event -> ptr_to_number_of_couples -> 4
ずさんな回避策を使用できますが、バグを回避するためにそれを行っていることは明らかです。むしろ、コードがコンパイルされない理由を学びたいと思います。私もやってみました:
permutable_array = malloc((*current_event->number_of_couples) * sizeof(int)); //Line 91
current_event-> number_of_couplesによって返されるポインターを逆参照する必要がありますが、クラッシュします。解決策はありますか?
*編集* 次のコード行で初期化されます。
fscanf(input_file, "%i", ¤t_event->number_of_couples);
そして、私のコードに到達する前に、プログラムによって少なくとも3回参照されます(有効なint値が格納されています)。2番目のビットは機能するため、確実に初期化されることを忘れないでください。