掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.30398

定義されてない配列
投稿者---かがみ(2007/06/28 11:26:34)


#include<stdio.h>

int main(){
int a[10];

a[13]=10;

}

上のプログラムは普通13まで定義されてないから代入は出来ないはずですがなぜかコンパイルが通ってしまいました。printfで見てもちゃんと代入されてました。どうしてエラーにはならないんですか?

コンパイルはLinuxのFedoraをサーバーに他のマシンでTeraTermでコンパイルしました。

環境の違いですか?


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:定義されてない配列 30399 bugs 2007/06/28 11:44:11
<子記事> Re:定義されてない配列 30400 YuO 2007/06/28 11:46:55
<子記事> Re:定義されてない配列 30401 かがみ 2007/06/28 12:00:54


No.30399

Re:定義されてない配列
投稿者---bugs(2007/06/28 11:44:11)


>int a[10];
>
>a[13]=10;

配列の定義範囲外の領域にアクセスするコードを書いても、
コンパイラはノーチェックです。
もしかしたら、オプションでチェックしてくれる
コンパイラがあるかもしれませんが…。
原則は何もチェックしないと理解していてよいと思います。

a[13]が誰か別の人のための領域であることは
間違いないですが、その領域に次回アクセスしない限り、
そこが壊れてしまっていることはわかりません。
たまたま破壊に気づかずに正常終了しているように
見えるだけです。



この投稿にコメントする

削除パスワード

No.30400

Re:定義されてない配列
投稿者---YuO(2007/06/28 11:46:55)


>上のプログラムは普通13まで定義されてないから代入は出来ないはずですがなぜかコンパイルが通ってしまいました。printfで見てもちゃんと代入されてました。どうしてエラーにはならないんですか?

コンパイルに関しては,文法違反でも制約違反でもなんでもないので,エラーにはなりません。
で,代入した時点で存在しないオブジェクトへの代入になるので,未定義の振る舞いということになります。
# 配列外アクセスは直接的にエラーになるわけではありません。

今回の場合だと,単にたまたま運が良かっただけ,というのが正しい説明かと。



この投稿にコメントする

削除パスワード

No.30401

Re:定義されてない配列
投稿者---かがみ(2007/06/28 12:00:54)


お二方とも早い回答ありがとうございました。

コンパイルは許されるけど原則しないほうがいいですね。


この投稿にコメントする

削除パスワード

No.30403

Re:定義されてない配列
投稿者---keichan(2007/06/29 09:39:09)


>コンパイルは許されるけど原則しないほうがいいですね。
違います。

"絶対にしてはいけない" です。


この投稿にコメントする

削除パスワード

No.30404

Re:定義されてない配列
投稿者---たかぎ(2007/06/29 13:11:08)
http://www.kijieneko.co.jp/


>"絶対にしてはいけない" です。

状況しだいでは?

関数の戻り先番地を取得したい場合や、仮引数並びへのポインタを取得したい場合など、低水準のライブラリ等を実装するにはそうせざるを得ない状況も考えられます。
実際、va_startマクロなんかは、似たようなことをやって実現していることもありますよね。
処理系自体の開発者以外がそんなことをするには、コンパイラの出力結果を検証することが必須ですが。

アプリケーションレベルの話に限定すれば、"絶対にしてはいけない"に同意します。



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧