day1_HelloWorldから学んだこと
int func1() { char strings[] = "Hello World"; printf("%s\n", strings); return 0; }
初日なのでHelloWorldから学びたい。
コードは過去の学習の記憶でなんとなく書き起こし。
printf()は他にも似たような関数があったなぁ、などと調べてみると色々出てきた。
sprintf()はprintf()がコンソールへ出力するのに対し、配列に出力とあった。
最初はピンと来なかったが、要するに文字列の結合に使えるということだろうか。
早速使ってみようと思ったらVisual Studioに怒られてしまった
C4996 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
どうやらsprintfの利用は現在では推奨されていないらしく、もし使うならsprintf_s()を使えとのこと。
が、一応以下を入れて警告を無視することは出来た。
#pragma warning(disable:4996) int func2() { char str[32]; char str1 = 'a'; char str2 = 'b'; sprintf(str, "mojiretu %c %c", str1, str2); printf(str); return 0; }
無視出来たのは良いものの、そもそもなぜsprintfの利用は推奨されないのだろうか。
なるほど、コピー先配列のサイズの指定がないため、サイズが足りない場合はバッファオーバーランが発生してしまうらしい。
実際にやってみるのが早そうだったのでやってみた。
printfは該当変数に格納されている文字列の終端文字まで表示する仕様だからなのか、出力自体はできていたようだった。
(が、変数strを確認してみると、確保されたメモリを超えているようだった。)
だが、例外が発生しており、エラー内容はstr関係のスタックが壊れてるよ、とのこと。
もしかして、returnで戻るべきメモリ上の位置が書き換えられたとかなのだろうか。
HelloWorldはたくさんのことが学べるなぁ・・・。
次回は 型 について勉強したい。