ページ 11

警告について

Posted: 2007年5月11日(金) 12:05
by 入門
よろしくお願いします。

scanfやfopenを使うと警告が出ます。
この事を先生に聞いてみると、新しい関数を使わないからだと言われました。
何かdefineで最初に書くとその警告は消えるけど根本的な解決にはならないということでした。

聞いてみたものの意味が良くわかりません・・。

Re:警告について

Posted: 2007年5月11日(金) 12:58
by
関数で検索をして調べて見ましょう^^

教科書とかがあるなら載ってるかもしてませんよ?

関数が何かってのを知ってればたぶん解決できるのでは?

どんな警告かも書いたほうがいいですよ~

Re:警告について

Posted: 2007年5月11日(金) 14:13
by フリオ
 
 使用しているコンパイラも書きましょう。

ひょっとしてこれかな?
http://www.geocities.jp/ky_webid/common ... rning.html
 

Re:警告について

Posted: 2007年5月11日(金) 19:46
by 管理人
きっとフリオさんのおっしゃる事で間違いないと思います。
リンク先にひと項目なかったので、ちょっと補足を。

>何かdefineで最初に書くとその警告は消えるけど根本的な解決にはならないということでした。

これは
#define _CRT_SECURE_NO_WARNINGS
これを書いたら警告が出なくなりますからその事だと思います。
根本的な解決にならないという意味はおそらく・・・。

警告というのは、深刻な間違いではないにしても、何か不具合をきたす可能性のある項目を挙げているんですから、
#defineで警告が出るべき項目を隠しても、結局不具合をきたす可能性は残ったままだと言う事だと思います。

不具合というのは、

例えば

char st[100];

で、宣言したとします。
st[0]のアドレスが1000番地だったとします。
アドレスは連続しますから、[99]のアドレスは1099になるはずですね。
領域が確保されるのは、最初から100バイト分です。
つまり1099番地までは使っても大丈夫だと保証してくれます。
しかし1100番地以降はつかっていい領域かどうかわかりません。
大事なデータが1101番地や1102番地にあるかもしれません。
そんな中、

scanf("%s",st);

で、120文字格納すると、1120番地まで文字と終端記号で埋めてしまいますから、1101番地にあった大事なデータは消えてしまいます。
そういう意味で、scanfなどはセキュリティの向上した新たに用意されたscanf_s関数を使った方がいいですよ、と警告が出るわけです。

入門時や短いプログラムを書く時や、ちゃんと管理して、絶対オーバーフローしない状況などでしたら、特に気にする事も無いと思います。
完全なプログラムを書く時に気にするようにしてはいかがでしょうか。