私はCの本のK &を読んでいて、Cのポインタ算術は配列の終わりを越えて1つの要素にアクセスできることを発見しました。私はCが記憶でほとんど何でもできることを知っているが、私は理解していない、この特異性の目的は何ですか?C - 配列の終わりを超えた要素
答えて
Cは、アレイの終わりを超えてメモリにのアクセスアクセスを許可しません。ただし、ポインタが配列の終わりを超えて1つの要素を指すことができます。この区別は重要です。
したがって、これはOKです:
char array[N];
char *p;
char *end;
for (p = array, end = array + N; p < end; ++p)
do_something(p);
(*end
を行うと、エラーになります。)
そして、それはこの機能が便利である理由を示しています(存在しないで指し示すポインタを)要素は、inループなどの比較に役立ちます。
技術的に言えば、それはC標準が許すすべてのものです。しかし、実際には、Cの実装(コンパイラとランタイム)では、配列の最後を超えてメモリにアクセスするかどうかは、要素が1つ以上であるかどうかをチェックしません。境界チェックが必要になり、プログラムの実行が遅くなります。 Cプログラムの種類(システムプログラミング、汎用ライブラリ)は、セキュリティと安全境界チェックよりもスピードが向上する傾向があります。
つまり、Cは多分汎用アプリケーションプログラミングのための良いツールではありません。
は多くの場合、あなたのようなコードを書くことができますので、実際の配分過去1である「終了」の位置を示すために役立ちます。
char * end = begin + size;
for (char * curr = begin; curr < /* or != */ end ; ++curr) {
/* do something in the loop */
}
C標準は、明示的にこの要素が有効であることを述べていますメモリアドレスが、逆参照はそれでも良い考えではありません。
なぜこの保証がありますか?たとえば、2^16バイトのメモリを持ち、アドレス0000-FFFF、16ビットのポインタを持つマシンがあるとします。 16バイトの配列を作成したとします。 FFF0でメモリを割り当てることができますか?
あり16のバイトが連続して無料ですが、:
begin + size == FFF0 + 10 (16 in hex) == 10000
ため、ポインタのサイズを0000にラップしています。ここでループ条件:
curr < end == FFF0 < 0000 == false
ループの代わりに何もしません。これは多くのコードを破るので、Cの標準では割り当ては許されないと述べています。
あなたが手の前にメモリ内に座っていたどんな単語列の末尾の後にゴミを出力しますexample`
int main()
{
char *string = "string";
int i = 0;
for(i=0; i< 10;i++)
{
printf("%c\n", string[i]);
}
return 0;
}
のために、アレイ を過ぎても1を超えて行くことができます。
- 1. Java:スライス配列終わり
- 2. ストリームの終わりを超えて読み取れません
- 3. Python:ファイルの終わりを超えて読む
- 4. 配列を超えたアルゴリズムチェックによるCのランタイムエラー
- 5. 前の配列の終わりの直後に次の要素を格納して配列を展開する
- 6. Javascript配列:500個の要素を超えて機能していません
- 7. 構造体の終わりのC配列の初期化
- 8. C++が配列ポインタの代わりにベクトル要素にポインタを渡す
- 9. 配列C++の特定の要素を数えます
- 10. 配列要素にC++ unique_ptr
- 11. C++で配列の要素を数える方法
- 12. マウスホイールイベントがRaphael要素を超えて
- 13. 文書の代わりに配列要素を照会
- 14. C配列の終わりに達した時を伝える方法は? (具体的にはargv)
- 15. 空の要素をC#バイト配列
- 16. 配列の要素の繰り返しを数えるjava
- 17. vuejsの配列内の要素を切り替える方法
- 18. 配列要素の配列要素をJavaで配列する
- 19. javascriptで配列内の配列要素を数えるには?
- 20. C++の配列のn個の要素
- 21. Cの配列内の要素の数
- 22. cの配列のピーク要素
- 23. C#の取得配列の要素数
- 24. 親要素の終わりでスティッキー要素を停止する方法
- 25. cで配列要素ポインタを渡す
- 26. 関数に渡された配列は、ナノ要素を与える(C++)
- 27. C#は、最後の配列要素
- 28. 配列Cの同じ要素
- 29. Duktape/C配列要素のアクセサリー
- 30. 客観C:配列要素の表示
この質問もご覧ください:http://stackoverflow.com/questions/988158/take-the-address-of-a-one-past-the-end-array-element-via-subscript-legal-by- –