-3

私は自分自身が C を書くことを教育し、情報技術の学習に関連するいくつかのことを行うために、リンクされたリスト ライブラリを作成しました。sizeof(double) が 4.9 で 0 に解決されたため、何かがひどく間違っていることがわかりました。

double ary[] = { 1.0, 2.0, 3.5, 4.9, 5.5 };
LinkedList *list = linkedlist(&ary[0], sizeof(ary[0]));
for( i = 1; i<len(ary); i++ )
    ll_push(list, &ary[i], sizeof(double) );

(このライブラリのこのテストの267 ~ 270 行目)

1.0、2.0、および 3.5 ではすべて問題ありませんが、4.9 では失敗します。以前は、コードに sizeof(ary[i]) がありましたが、現在は sizeof(double) も同じようになります。

私はこれに本当に腹を立てています。なぜこれが起こるのか、誰でも説明できますか?

4

2 に答える 2

7

いくつかの無関係な状況を除いてsizeof、コンパイル時のエンティティであり、常に「解決」され、コンパイル時に実際の定数値に置き換えられます。これは、あなたが説明することは完全に不可能であることを即座に意味します。sizeof(ary[i])に応じてその値を変更することはできませんi。お使いのプラットフォームでは両方ともsizeof(double)sizeof(ary[i])常に即時に置き換えられ、8実行時の要因には依存しません。

あなたのプログラムに何が間違っていても、 の動作とはまったく関係ありませんsizeofsizeof何らかの形で0for を評価することについてのあなたの結論ary[3]は正しくありません。のバージョンsizeof(double)がまったく同じように失敗するという事実は、明確なヒントになるはずです。

于 2012-10-18T18:33:28.120 に答える
1

すべてのコンパイラ警告を修正すると、プログラムが期待どおりに動作する可能性が高くなります。

cc -Wall -c ll_test.c

ll_test.c:67: warning: initialization makes integer from pointer without a cast
ll_test.c:67: warning: initialization makes integer from pointer without a cast
ll_test.c: In function 'test_dump':
ll_test.c:280: warning: format '%f' expects type 'double', but argument 2 has type 'double *'
ll_test.c:280: warning: format '%f' expects type 'double', but argument 3 has type 'double *'
ll_test.c: In function 'test_get_by_cond':
ll_test.c:295: warning: unused variable 'cmpList'
ll_test.c: In function 'test_datasize_of_last':
ll_test.c:422: warning: unused variable 'result'
ll_test.c: In function 'test_datasize_of_list':
ll_test.c:455: warning: unused variable 'result'

printf-formatting エラーに特に注意してください。

于 2012-10-18T21:36:28.993 に答える