C言語 C2113エラー ポインター以外からポインター減算を実行した場合の原因と解決方法
C言語で発生するエラー C2113 は、演算子「-」を使った際に、右側のオペランドがポインターであるのに対して、左側のオペランドがポインター以外の場合に表示されるエラーです。
つまり、ポインター同士での減算が正しく行われていないために発生します。
エラー解消には、各オペランドの型を確認して正しいポインター演算がなされるよう修正することをおすすめします。
エラーC2113の原因
ポインター演算の基本ルール
減算演算子の仕様と制限
C言語では、減算演算子-
は基本的にポインター同士の演算に使用されます。
片方のオペランドがポインターで、もう片方がポインター以外の場合、減算演算が適用されずコンパイル時にエラーが発生します。
したがって、減算の際は、両方のオペランドが同一のポインター型でないといけません。
オペランドの型チェック
コンパイラは、演算を行う前にオペランドの型を厳密にチェックします。
数値型とポインター型など、異なる型の組み合わせで減算を試みると、型が一致しないためエラーが発生します。
型の整合性を保つことは、バグの混入を防ぐ上で非常に重要です。
ポインター以外からの減算による問題
左側オペランドがポインターでないケース
ポインター以外の値が左側のオペランドとなると、ポインター減算の演算規則に反するため、コンパイラはエラーC2113を出します。
このようなケースにおいては、演算対象が正しい型になっているかどうかをよく確認する必要があります。
エラーC2113の発生例
不適切なコード例
左側がポインター以外の場合の具体例
以下のコードは、数値型の変数が左側に使用されており、エラーC2113が発生する具体例です。
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int number = 10; // 数値型変数
int *pointer = NULL; // ポインター型変数
// 以下の行はエラーC2113を発生させます
int result = number - pointer; // 誤った減算処理
printf("結果: %d\n", result);
return 0;
}
error: invalid operands to binary expression (‘int’ and ‘int*’)
コンパイラメッセージの解析
エラーメッセージの内容と注意点
コンパイラから出されるエラーメッセージには「invalid operands」という表現があり、これは減算のオペランドに不適切な型が指定されていることを示します。
エラーメッセージの内容に注目し、数値型とポインター型が混在していないかを確認することが大切です。
エラーC2113の解決方法
正しいポインター減算の記述方法
型の整合性確認と修正例
正しいポインター減算を行うためには、両方のオペランドが同じ型のポインターである必要があります。
以下の修正例は、配列内の要素間の距離を取得する正しい方法を示します。
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int array[5] = {0, 1, 2, 3, 4};
int *ptr1 = &array[0]; // 配列の先頭アドレス
int *ptr2 = &array[3]; // 配列の4番目の要素のアドレス
// 正しくポインター同士の減算を行い、配列内の要素間の差を求めます
int diff = ptr2 - ptr1;
printf("ポインターの差: %d\n", diff); // 結果は3です
return 0;
}
ポインターの差: 3
コード修正のポイント
修正によるエラー解消の流れ
まず、誤ったコードがどの箇所で型の不整合を起こしているかを確認します。
次に、以下のポイントに注意して修正を行います。
- オペランドの型が一致しているかをチェックする
- 数値型を無理にポインター演算に用いない
- 計算を行う対象が、必ず同じオブジェクトまたは同じ配列内のポインターであるようにコードを見直す
このように注意することで、エラーが発生しなくなるケースが多く見受けられます。
型と演算子に関する補足事項
ポインターと非ポインター間の演算の理解
演算ルールの詳細と具体例
ポインターと非ポインター間で行う演算は、基本的に単純な減算ではなく、型のキャストや別の計算手法が必要になります。
以下のような具体例があります。
- 配列の位置を計算する際は、ポインター同士の演算を利用する
- 異なる型を混ぜて計算する必要がある場合、コンパイラの警告が出るため、事前に型変換を検討する
表にまとめると以下のようになります。
シチュエーション | 正しい方法 | 注意点 |
---|---|---|
配列内の距離計算 | 同一配列内のポインター同士で減算 | 異なる配列や異なる型のポインターは不可 |
数値とポインターの減算 | 基本的に行わない。必要なら別途型変換や異なる演算を検討する | 型の不一致によるエラーに注意 |
異なる型のポインター演算 | コンパイラ警告が出るため、正しい型を明示的に指定し統一する | 型キャストによる意図しない挙動に注意 |
これらのルールを把握することで、ポインター演算に関するエラーを防ぐことができます。
まとめ
今回の記事では、エラーC2113が発生する原因や、ポインター減算に必要な型の整合性について説明しました。
誤ったコード例を通して、数値型とポインター型の間での不適切な演算が如何にエラーを引き起こすかを確認しました。
正しいポインター同士の演算方法を身につけるため、オペランドの型に十分注意しながらコードを記述することが大切です。