0
if( (*ptr != ',') || strlen(ptr+1) < sizeof(struct A) * num1)
{
    printf("\n Condition satisfied.");
}

これが問題のコードです。str = "-1,ABCDEFGH" という形式の文字列と、サイズが 15 バイトの構造体 A があります。

私は事前にこの操作を行っています:

number = strtoul(str, &ptr, 10);

この操作の後、ptr は「,」を指し、number = -1

IF 条件を見ると、最初のステートメントは偽であると評価され (*ptr = ',' のため)、2 番目のステートメントは偽であるはずなのに実行されて TRUE になります ( strlen(ptr+1) は正であり、(sizeof( struct A) * number) は、単に num1 が負の値であるため、負です)。

このステートメントが true であると評価され、IF ブロックに入るのはなぜですか? 「条件が満たされました」という出力が得られますが、そうではありません。前もって感謝します。

4

2 に答える 2

4

(sizeof(struct A) * number)が負num1の値であるため、負です。

そうではありません。sizeof(struct A)size_t(符号なし型) があります。

仮定して

  • numタイプintは 、
  • に対応する符号付き型の精度は、size_tの精度と同じかそれ以上です。int

sizeof(struct A) * numが負の値であっても、符号なしの値です (したがって負ではありません) num

算術演算子を参照してください。

それ以外の場合、符号なしオペランドの変換ランクが符号付きオペランドの変換ランク以上の場合、符号付きオペランドは符号なしオペランドの型に変換されます。

@ user3386109がコメントしたようにstrlen、署名されていない型も使用することに注意してください。<したがって、 と同じ問題が発生する可能性があり*ます。

于 2015-09-12T02:12:18.557 に答える
-2

sizeof(struct A) は未定義であり、また数値が乗算されるため、

于 2015-09-12T02:16:01.553 に答える