
windows 10
gcc version 5.2.0 (Rev4, Built by MSYS2 project)
の環境で主にアルゴリズムの勉強をしております。
通常は-Wallオプションのみ使用してコンパイルしていました。
あるソースをコンパイルしたところ正常動作しなかったので、いろいろ調べたところ最適化オプション(-On, n=1,2,3,s)を使用すると正常動作する実行ファイルができることが分かりました。
これはgccのバグなのでしょうか?
それとも、最適化オプションは必ず使用するという前提なのでしょうか?
ご教示をお願いします。
No.4ベストアンサー
- 回答日時:
> char **
> read (void)
> {
> char buf0[BUF_SIZE];
> char buf1[BUF_SIZE];
> static char * string_pair[2];
>
> fputs ("比較元:", stdout);
> fgets (buf0, BUF_SIZE, stdin);
> fputs ("比較対象:", stdout);
> fgets (buf1, BUF_SIZE, stdin);
> string_pair[0] = buf0;
> string_pair[1] = buf1;
>
> return string_pair;
> }
この関数には1つ推奨できない点と1つの間違いがあります。
read はある処理系において予約関数です、この名前は使用すべきでなないです。(←余談です)
問題は、変数 buf0 と buf1 です。この変数は、ローカル変数でスタック上に記憶領域がとられます。よって、この変数はこの関数から戻ったら無効になります。
最適化した場合にうまく動作するのは、恐らくインライン展開のような最適化が行われ、結果的に変数の記憶領域がスタック上に置かれない、もしくはmain () と同一のスタック上に置かれるためと思われます。
確認するには、最適化した時のアセンブラーコードを確認する必要がありますが。
詳しいご説明をありがとうございました。
ご説明いただいた内容に納得です。
なお、buf0とbuf1をstaticにしたところ、最適化しなくても正常動作することを確認しました。
出力したアセンブラーソースを読み取るのは、能力的に無理でしたw
とりあえず自分の使用しているコンパイラのバグでないことが判りホッとしました。
C言語の、この手の間違いは一旦ハマると見つけるのは大変なのでしょうね、簡単に見つけ出せる方法があると良いのですが。
No.3
- 回答日時:
char** read(void) {
> char buf0[BUF_SIZE];
> char buf1[BUF_SIZE];
> static char* string_pair[2];
fputs("比較元:", stdout);
fgets(buf0, BUF_SIZE, stdin);
fputs("比較対象:", stdout);
fgets(buf1, BUF_SIZE, stdin);
> string_pair[0] = buf0;
> string_pair[1] = buf1;
> return string_pair;
}
>の付いた部分はいいんでしたっけ?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(IT・Webサービス) ホームページにカウント数を表示する 2 2022/10/28 10:37
- Excel(エクセル) 「Excelのオプション」の「ユーザーインターフェイスのオプション」の設定値をVBAで取得したい 1 2022/07/31 23:49
- Windows 10 Windows10でセーフモードが出来ません。 2 2022/04/22 23:37
- Windows 10 フォルダの新規作成を必ず「ドキュメント」にする方法 1 2023/06/24 09:08
- CPU・メモリ・マザーボード 起動時にF1を要求されます。 2 2023/01/22 12:55
- Visual Basic(VBA) VBA アドインについて お詳しい方 ご教授をお願いします。 相談事項 現在以下の対応を実施した所、 1 2022/11/02 16:53
- 教育・文化 高校生です。将来政治家になって犯罪率を0.0%代にしたいのですが、可能だと思いますか? ㅤ 大まかな 8 2022/08/27 18:51
- その他(プログラミング・Web制作) プログラムの勉強のおすすめは 7 2022/12/09 20:09
- ドライブ・ストレージ Android端末でSDカードが機能しなくなりました 6 2023/02/17 17:20
- Excel(エクセル) VBA : スクレイピングできない 4 2023/05/12 22:26
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
キャスト変換について
-
ひとつのプログラムにしたいの...
-
構造体の各メンバにfor文からア...
-
C言語で、再帰呼び出しを使用...
-
オブジェクト(メモリ)のアド...
-
プログラム
-
atofで、どこまでか判定する
-
wake on lan のwindowsプログラ...
-
動的に生成した文字列の配列を...
-
kill.c
-
出力をパースペクティブに表示...
-
1bppファイルを8bpp(raw)に変換...
-
boost::pointee
-
Cのmain()の引数に関する質門で...
-
strchr() の第2引数はなぜ int ...
-
再帰プログラム
-
文字列の比較について
-
文字を数値化する方法で詳しく...
-
実行ファイルのweb掲載可否
-
データ型変換
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
文字列から空白を取り除きたい...
-
間接参照のレベルが異なっています
-
C言語のfor文です。 繰り返しの...
-
CStringをwchar_tに変換したい
-
テキストデータをそのままバイ...
-
charからLPTSTRへの変換方法
-
atoi( ) の反対をやりたい
-
charでの計算?
-
配列をnビットシフトする
-
c++ 文字列を入力して、一文字...
-
'const char *' 型は 'char *' ...
-
c言語でユーザ関数を利用して入...
-
干支のプログラム
-
switch文で文字を比較すること...
-
char型からのバイト数取得
-
ネットワークにつながっている...
-
getchar()を int でとる理由...
-
間接操作のレベルとは
-
str系関数を使わずに二つの文字...
おすすめ情報
>「正常動作しなかった」というのが、「具体的にどうせ異常でなかったのか?」すら不明なので
失礼しました。対象ソースは
https://oshiete.goo.ne.jp/qa/9343826.html のNo.11で提示されているものです。
正常な動作結果は、当該質問欄に「出力例」として提示されている内容です。
私の環境で最適化オプションをつけず-Wallのみつけて、コンパイルした結果は下記になります。
※関数char** read(void)内で、2箇所のfgets()の前にfflush(stdout);を追加しています。
$ gcc -Wall test.c
$ ./a.exe
比較元:ABCDEFG
比較対象:AVCEFZG
A(挿入)G(脱落)
編集距離:0.429